Python大数据分析3:柱状图绘制

这里我们再介绍一些常用的图样,它们可以表达不同场景下的数据效果。

我们先看看柱状图:

# coding:utf-8
import pandas as pd
import matplotlib.pyplot as plt

frame = pd.read_csv('C:\\temp\\股票数据.csv', encoding='GBK')
frame = frame.set_index('日期')
frame.index = pd.to_datetime(frame.index)
plt.bar(frame.index, frame['收盘价'])
plt.show()

这里关键就是一个bar函数,它至少有两个参数,一个是横轴数据,一个是纵轴数据。

从图形中看的出来,它就是一条一条垂直线段,每个线段的长度就是收盘价。显然,这种方式其实更适合使用线性图或者散点图来做,通常柱状图更适合表现一些数据量相对较小的数据。

我们先对数据按照年份进行分组:

results = frame[[‘收盘价’]].groupby(frame.index.year).mean()

print(results)

这里显示的是每个年代收盘价的平均值。

我们对其进行柱状图显示:

results = frame[[‘收盘价’]].groupby(frame.index.year).mean()

plt.bar(results.index, results[‘收盘价’])

plt.show()

我们对分组后的数据,将年份索引设置为横轴,平均收盘价作为纵轴。

结果看的很清楚。不过,好像柱子有点太宽了,颜色也不好看。

我们对样式调整下:

plt.bar(results.index, results[‘收盘价’], 0.2, label=”close”, color=”#87CEFA”)

plt.legend()

plt.show()

这里很多大家应该都知道是什么意思,0.2表示宽度,变成标准宽度20%,label需要legend才能最终显示出来,这里的color我们使用了一种新的表示方法,称之为红绿蓝三色系,每种颜色占据两个字符,分别是十六进制的一个数字,各自代表红绿蓝各为什么颜色,形成一种组合颜色,显然这样颜色定义更为丰富多彩。

一般而言,这种图形都是通过方柱的长短表达所需显示数据的大小,如果想同时展示更多的数据内容,那就可以需要通过设置其他参数来表达。正如散点图可以同时通过点坐标、点大小、点颜色等方式来表达数据一样。

比如我们准备通过方柱的宽度来表达下换手率。首先我们先得到按年份汇总的收盘价和换手率:

results = frame.groupby(frame.index.year).agg(avg1=(‘收盘价’, ‘mean’), avg2=(‘换手率’, ‘mean’))

print(results)

这里我们使用agg同时统计了两个不同列的年度平均值。

然后使用年度平均收盘价作为标准方柱长度数据,换手率作为方柱宽度,由于宽度表示比例,一般最好为0到1之间,因此我们故意除以10,以将所有宽度变小。

plt.bar(results.index, results[‘avg1’], width=results[‘avg2′] / 10, color=’#87CEFA’)

plt.show()

从图中相对大小依然能看出换手率的大小。

通过颜色来区分其他数据的大小也是可行的,

import matplotlib.cm as cm

plt.bar(results.index, results[‘avg1’], color=cm.ScalarMappable().to_rgba(results[‘avg2’]))

plt.show()

不过要注意,这里不能直接利用数据来表示颜色,需要调用matplotlib库中子类型的to_rgba函数转换为颜色序列。

一般默认情况下颜色越浅数据越高。

如果想看出每种颜色对应的数值:

sm = plt.cm.ScalarMappable(norm=plt.Normalize(vmin=results[‘avg2’].min(), vmax=results[‘avg2’].max()))

plt.colorbar(sm)

plt.show()

那就需要加上colorbar颜色条,但是此时需要指定颜色条的数值范围,这些内容略复杂,不过大家可以自行根据需要修改使用即可,看得出,只需设置下ScalarMappable参数中那个最小值和最大值即可。

结果更为清楚了。

也可以通过显示多个方柱来展示多个数据,但是考虑到数据范围,最好是具有相似数据范围的数据才好进行展示。比如我们展示年度平均最高价和最低价,这里首先需要得到年度平均最高价和最低价,这个不难,接下来,需要绘制两个方柱。

可以调用两次bar函数,但是位置略有差异:

results = frame.groupby(frame.index.year).agg(high=(‘最高价’, ‘mean’), low=(‘最低价’, ‘mean’))

plt.bar(results.index, results[‘high’], width=0.2, color=”r”)

plt.bar(results.index + 0.2, results[‘low’], width=0.2, color=”b”)

plt.show()

第二个bar显示的位置也加了0.2,和第一个方柱宽度一样,可以想象它会向右移动。

细心的同学可以看出横轴的点不再居中对齐,仍然还是对齐第一个bar的中间。

为此,我们还可以继续调整x轴显示的内容位置:

plt.xticks(results.index + 0.1)

plt.show()

这个0.1是半个方柱的宽度。

正好对齐了现在两个相邻方柱的中间。从中看出有的年份两者相差不大,而有些年份差异很大。

为了更突出不同线段的差异,我们还可以设置y纵轴的显示范围:

plt.ylim(5, 35)

plt.show()

此时可以根据需要有选择的显示部分图的内容,增强显示数据的效率。

也可以考虑将不同的方柱绘制在同一位置上产生叠加效果:

plt.bar(results.index, results[‘high’], width=0.2, color=”r”, alpha=0.5)

plt.bar(results.index, results[‘low’], width=0.2, color=”b”, alpha=0.5)

plt.show()

这里两个方柱都是同样的横轴,因此后来绘制的方柱会在前面方柱上面继续绘制。为了防止后绘图形完全盖住了前面的图形,可以考虑将透明度增加下:

我们可以看到此时的效果。

也可以不重叠的叠加,直接将第二个方柱绘制在第一个方柱的正上方:

plt.bar(results.index, results[‘high’], width=0.2, color=”r”)

plt.bar(results.index, results[‘low’], bottom=results[‘high’], width=0.2, color=”b”)

plt.show()

此时需要利用bottom属性指定起始纵轴位置。

看的出来,这样就不用担心互相遮挡的问题了。

最后我们来看看两个更为奇特的效果。比如一个横向的柱状图,barh函数表示水平方向的柱状图:

plt.barh(results.index, results[‘收盘价’])

plt.show()

用法类似,只是横向显示。

甚至可以改变平面坐标,换为极坐标,就产生出另外一种效果:

results = frame[[‘收盘价’]].groupby(frame.index.year).mean()

plt.subplot(projection=’polar’)

plt.bar(results.index, results[‘收盘价’])

plt.show()

这里的subplot表示中参数的设定为极坐标。

此时的效果更为炫目些。

Python大数据分析3:柱状图绘制》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注