Pandas和Seaborn
matplotlib为我们提供了基本的绘图功能,不过图片会有些单调,如何进行美化呢?
有一个非常简单且一步到位的方法—— import seaborn即可。
1、线型图
在Pandas下,整理好数据后便可用plot()对序列或dataframe绘制线型图。例如之前天齐锂业的例子:
df4.plot()
# df.plot()等价于df.plot.line()
如果是序列,其索引会被传到图像中,作为X轴的内容。use_index=False来禁用这一功能。然后用xticks和xlim来设置刻度和界限。
plot()的更多参数如下:
DataFrame绘图的更多参数如下:
2、柱状图
水平的柱状图,可用plot.bar()
垂直的柱状图,可用plot.barh()
生成的图表轴刻度,默认是数据的索引。
- 对于序列:
fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(21), index=list('getlotsofrandomnumber'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)
若想查看频数的柱状图,可用value_counts():
s = pd.Series(['1','2','3','2','3','3','4'])
s.value_counts().plot.bar()
- 对于dataframe:
df = pd.DataFrame(np.random.rand(6, 4),
index=['one', 'two', 'three', 'four', 'five', 'six'],
columns=pd.Index(['A', 'B', 'C', 'D'], name='Grade'))
print df
df.plot.bar()
程序会自动将列的名称视为图例的标题。
如果想要堆积起来的柱状图,可用加上stacked=True
:
在dataframe中,可指定使用哪些列的数据:
df4 = df4.iloc[[100,500,800,1000,1500,1700],:]
sns.barplot(x='closePrice', y='asset volumes', data=df4, orient='h') # orient='h'表示水平的柱状图,v表示垂直的
如果同一资产量对应了多个收盘价,那么X轴取的是收盘价的平均值。届时图形中会出现一条黑线,这条黑线代表了置信度为95%的取值范围。
更进一步的设置:
df4.columns = ['tradeDate','closePrice','asset volumes']
df4 = df4.iloc[[100,500,800,1000,1500,1700],:]
sns.barplot(x='closePrice', y='asset volumes', data=df4, orient='h' ,hue='tradeDate')
# orient='h'表示水平的柱状图,v表示垂直的
# 可用'hue'来增加图例
sns.set(style="darkgrid") #可选择使用sns内置的风格
#Seaborn有五个预设好的主题: darkgrid , whitegrid , dark , white ,和 ticks 默认: darkgrid
3、直方图、密度图
直方图可显示数据频率的离散化程度。
例如天齐锂业均线金叉策略的例子,实际仓位的频率分布图如下:
df['实际仓位'].plot.hist(bins=50)
可见,满仓的日子大于空仓的日子。
密度图是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正态分布之类的较为简单的分布)。因此,密度图也被称作KDE(Kernel Density Estimate,核密度估计)图。
df['实际仓位'].plot.density()
使用seaborn的distplot方法,可以同时画出直方图和连续密度估计图。
comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
print values.shape
sns.distplot(values, bins=100, color='k')
4、散布图或点图
使用seaborn的regplot方法,可以画出一个散布图及一条线性回归线。
df = pd.DataFrame(np.random.rand(6, 4),
index=['one', 'two', 'three', 'four', 'five', 'six'],
columns=pd.Index(['A', 'B', 'C', 'D'], name='Grade'))
print df
df1 = np.log(df).diff().dropna() #求df的对数差分
print df1
# 使用regplot的方式
sns.regplot('A', 'B', data=df1)
plt.title('Changes in log %s versus log %s' % ('A', 'B'))
如果要同时观察一组变量的散布图,即散布图矩阵(scatter plot matrix),可使用pairplot()函数。它将在对角线上放置每个变量的直方图或密度估计。
sns.pairplot(df1, hue=None, hue_order=None, palette=None, vars=None, x_vars=None, y_vars=None, kind='scatter', diag_kind='kde', markers=None, size=2.5, aspect=1, dropna=True, diag_kws=None, grid_kws=None
, plot_kws={'alpha': 0.2})
# plot_kws参数可以传递配置选项到非对角线元素上的图形
5、分面网格(facet grid)和类型数据
对于有分组维度的数据集,可用factorplot()函数进行统计。
df4 = df[['交易日期','收盘价','策略仓位','总资产']]
df4.columns = ['tradeDate','closePrice','pos','asset volumes']
df4 = df4.iloc[[100,500,800,1000,1500,1700],:]
sns.set(style="darkgrid") #可选择使用sns内置的风格
sns.factorplot(x='closePrice', y='asset volumes', hue='tradeDate', col='pos',kind='bar', data=df4)
# 这里按照col来进行分类,如有必要,还可以加入row=‘’来扩展分组
# kind除了bar,还可以用box等图形。详情可参阅https://seaborn.pydata.org
总结
这一节主要讲了Pandas和Seaborn的基本绘图方法,在“信息可视化技能进阶2”的课程里,我们会学习如何对时间序列的数据进行绘图。
刺猬偷腥
2018年10月1日