这里我们再介绍一些常用的图样,它们可以表达不同场景下的数据效果。
我们先看看柱状图:
# 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表示中参数的设定为极坐标。
此时的效果更为炫目些。
数据为:http://njcie.com/python/股票数据.csv