Pandas有许多能够利用DataFrame对象数据组织特点来创建标准图表的高级绘图方法,本文主要介绍的是pandas中的绘图函数。
#coding:utf-8
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
1. 线形图
df.plot( kind='line')
- Series 的plot 方法会以index作为X轴,画一条线
- DataFrame 的plot 方法会以index作为X轴,给每一列绘制一条线,columns作为图例。
#第一种创建画布和画布分区方法,分开创建figure和subplot对象
fig=plt.figure()
#Series 的线形图
ax1=fig.add_subplot(2,1,1)
s=Series(np.random.rand(10).cumsum(),index=np.arange(0,100,10))
s.plot( kind='line')
plt.xlabel(u"index")
plt.title(u"Serise的线形图")
plt.show()
#DataFrame的线形图
ax2=fig.add_subplot(2,1,2)
df=DataFrame(np.random.rand(10,4).cumsum(0),index=np.arange(0,100,10),columns=pd.Index(['A','B','C','D'],name='Genus'))
df.plot( kind='line')
plt.xlabel(u"index")
plt.title(u"DataFrame的线形图")
plt.show()
其中,Series.plot方法的参数
- kind :图的类型,‘line’,'bar','barh','kde'
- label :图例标签
- ax :需要绘制的对象
- rot :旋转角度
- xticks :X轴刻度值
- xlim :X轴刻度范围
- grid :显示网格
2. 柱状图
df.plot( kind='bar')
: 垂直柱状图
df.plot( kind='barh')
: 水平柱状图
df.plot( kind='bar',stacked=True)
: stacked属性为True可以设置为堆积柱状图
Series的柱状图
#第二种创建画布和画布分区方法,创建figure,返回一个subplot对象
fig,axes =plt.subplots(2,1)
s=Series(np.random.rand(16),index=list('abcdefghijklmnop'))
s.plot( kind= 'bar' ,ax=axes[0]) #返回的axes的数组可指定在哪个subplot对象上画图
s.plot( kind= 'barh' ,ax=axes[1])
plt.show()
DataFrame的柱状图
- 每一行的值为一组,每一列的columns为图例
fig,axes =plt.subplots(2,1)
df=DataFrame(np.random.rand(4,4),index=['one','two','three','four'],columns=pd.Index(['A','B','C','D'],name='Genus'))
df.plot( kind= 'bar',ax=axes[0] )
df.plot( kind= 'bar',ax=axes[1],stacked=True ) #stacked=True 可以生成堆积柱状图
plt.show()
3.密度图( KDE, Kernel Density Estimate ,核密度估计 )
- 密度图即为连续概率分布图,将分布近似为标准混合正态分布。
df.plot( kind='kde')
fig=plt.figure()
#Series 的密度图
fig.add_subplot(2,1,1)
s=Series(np.random.rand(50).cumsum(),index=np.arange(0,100,2))
s.plot(kind='kde')
plt.title(u"Series的密度图")
plt.show()
#DataFrame 的密度图,会给每一列都画一条密度估计线,并将columns自动生成图例
fig.add_subplot(2,1,2)
df=DataFrame(np.random.rand(10,4).cumsum(0),index=np.arange(0,100,10),columns=pd.Index(['A','B','C','D'],name='Genus'))
df.plot(kind='kde')
plt.title(u"DataFrame的密度图")
plt.show()
4.直方图
- 直方图是对值频率进行离散化显示的柱状图,数据点呗拆分到离散的、间隔均匀的面元中。
df.hist( bins=10)
:bins属性可设置柱子数量
fig=plt.figure()
#Series 的密度图
fig.add_subplot(2,1,1)
s=Series(np.random.rand(20).cumsum(),index=np.arange(0,100,5))
s.hist( bins=10)
plt.title(u"Series的直方图")
plt.show()
#DataFrame 的密度图,会给每一列都画一张直方图,并将列名作为对应标题
fig.add_subplot(2,1,2)
df=DataFrame(np.random.rand(10,4).cumsum(0),index=np.arange(0,100,10),columns=pd.Index(['A','B','C','D'],name='Genus'))
df.hist( bins=10)
plt.show()
5.散点图
- 散点图是观察两个一维数据间关系的有效方式
plt.scatter(X,Y)
macro = pd.read_csv('macrodata.csv')
data = macro[['cpi','m1','tbilrate','unemp']]
trans_data = np.log(data).diff().dropna()
# 画出两个Series之间的散点图
plt.scatter(trans_data['m1'],trans_data['unemp'])
plt.title('Change in log %s vs.log %s' % ('m1','unemp'))
plt.show()
DataFrame的散点图矩阵
创建散布图矩阵,会把DataFrame中任意两列画散点图,观察其之间的关系。
支持在对角线上放置各变量的直方图或者密度图
pd.scatter_matrix( trans_data ,diagonal = 'kde' ,color ='k' ,alpha=0.3)
# 画出散布图矩阵
pd.plotting.scatter_matrix( trans_data ,diagonal = 'kde' ,color ='k' ,alpha=0.3)
plt.show()