import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
基本入门
简单图
当用户只提供了一个单维列表或数组时,matplotlib会将其看成是一系列的Y值,并在图中将其连起来,而且会根据Y值得数量自动添加X的坐标值。
data=np.random.randn(50)
plt.plot(data.cumsum())
plt.show()
线形图
线形图为最基本的图类,没啥好说的
X=np.arange(10)
Y=X**2
plt.plot(X,Y,color='g',linestyle='--') #绿色线条,虚线
plt.show()
散点图
最基本的散点图常用来找出两个变量之间的关系
X=np.arange(30) #30个序列值
Y=X+3*np.random.randn(30) #Y为X的值加上3倍的高斯噪声
plt.scatter(X,Y)
plt.show()
柱状图
柱状图常用于绘制频率图,数据通常为单维数据,展示变量的频率分布
data=np.random.randn(100) #服从标准正态分布的数据集
plt.hist(data,bins=20,color='k',alpha=0.3) #将X分为20个区间,黑色,透明度0.3
plt.show()
子图
有时需要同时绘制多张图片,这时候可以使用subplots()绘制子图。
fig,axes=plt.subplots(2,2)
axes[0,0].hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
axes[0,1].scatter(np.arange(30),np.arange(30)+np.random.randn(30))
axes[1,0].plot(np.random.randn(50).cumsum(),'k--')
plt.show()
颜色、标记与线条风格
在绘制线形图时,常用的参数有:
- 颜色:color=
- 线条风格:linestyle=
- 标记:marker=
data=np.random.randn(20)
plt.plot(data,color='r',linestyle='-',marker='o') #红色,实线,圆点标注
plt.show()
注意到线形图对于相邻点之间的连线方式是在两点之间连直线,可以使用参数drawstyle=
来改变连线的方式:
X=np.arange(10)
Y=X**2
plt.plot(X,Y,drawstyle='steps-post',color='k')
plt.show()
标号、轴标签与图例
data1=np.random.randn(1000)
data2=np.random.randn(1000)
data3=np.random.randn(1000)
fig=plt.figure() #新建一个图对象
ax=fig.add_subplot(111) #以一行一列的方式,在第一个位置增加一个子图
ax.plot(data1.cumsum(),color='k',label='one') #线条标签为'one'
ax.plot(data2.cumsum(),color='b',linestyle='--',label='two') #线条标签为'two'
ax.plot(data3.cumsum(),color='r',linestyle='-.',label='three') #线条标签为'three'
ax.legend(loc='best') #添加图例
ticks=ax.set_xticks([0,250,500,750,1000]) #指定X轴的显示数字
labels=ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small') #转换X轴的显示值
ax.set_xlabel('Stages') #X轴命名
ax.set_title('title of pic') #图命名
plt.show()
图内说明
X=np.arange(-1,1,0.01)
Y=X**2
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(X,Y,color='k')
min_loc=(0,0)
ax.annotate("min", #说明文字
xy=(min_loc), #需要添加说明的点的坐标
xytext=(min_loc[0],min_loc[1]+0.2), #说明文字的坐标
arrowprops=dict(facecolor='black')) #箭头属性
plt.show()
保存图片
fig,axes=plt.subplots(2,2)
axes[0,0].hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
axes[0,1].scatter(np.arange(30),np.arange(30)+np.random.randn(30))
axes[1,0].plot(np.random.randn(50).cumsum(),'k--')
plt.savefig('tmp.png',dpi=400,bbox_inches='tight')
使用pandas和seaborn画图
matplotlib是一个相当低级的画图工具,实际中只会用到其一些基本组件,如:数据展示、图例、标题和标注等。
pandas中可能存在多列数据,并且伴有行列标签,pandas中内置了简化后的对于DataFrame与Series的可视化方法,另一个库是seaborn。
线形图
对Series直接绘图时,会将序列的数据当成一系列Y值,而将Series的index当作X值:
X=np.arange(0,100,10)
Y=X**2
obj=pd.Series(Y,index=X)
obj.plot()
plt.show()
如果不想使用Series的index当作X值,使用参数use_index=
:
obj.plot(use_index=False)
plt.show()
DataFrame直接绘图类似,会将DataFrame的每一列看作是不同的Y值序列,并使用index作为统一的X值:
frame=pd.DataFrame(np.random.randn(50,4),
index=np.arange(0,500,10),
columns=['A','B','C','D'])
frame.plot(use_index=False)
plt.show()
条形图
plot.bar()与plot.barh()分别绘制竖直状的条形图与水平状的条形图。
fig,axes=plt.subplots(2,1)
obj=pd.Series(np.random.rand(5),index=['a','b','c','d','e'])
obj.plot.bar(ax=axes[0],color='k',alpha=0.7) #ax参数接收子图的位置
obj.plot.barh(ax=axes[1],color='k',alpha=0.7)
plt.show()
对于DataFrame,会将每一条数据(row)当作一个条,而将不同列的值整合到一个条中:
df=pd.DataFrame(np.random.rand(4,4),
index=['one','two','three','four'],
columns=['A','B','C','D']) #每条数据有4列,因此绘图时每大条包含4个子条
df.plot.bar()
plt.show()
可以使用参数stacked=
将子条压缩成一大条:
df.plot.barh(stacked=True)
plt.show()
假设需要统计派对人数与周几的关系,可以使用条形图来展示:
data=pd.read_csv('examples/tips.csv')
data.sample(5)
tips=pd.crosstab(data.loc[:,'day'],data.loc[:,'size'])
tips
party_pcts=tips.div(tips.sum(axis=1),axis=0) #每行的数据除以列和,将每天的派对尺寸转换成百分比形式
party_pcts.plot.bar()
plt.show()
当数据在绘制之前需要求和时,使用seaborn包会更简单:
sns.barplot(x='size',y='day',data=data,orient='h') #直接绘制size对于day的均值
plt.show()
上图中的黑线为置信区间。
分面图与非数值型数据
当需要对某一个非数值类型的变量再进行分别绘图以查看对比时,可以使用seaborn的factorplot()方法绘制对比图:
sns.factorplot(x='day',y='size',
row='time',col='smoker', #以time的种类为行,以smoker的种类为列
kind='bar',data=data)
plt.show()
sns.factorplot(x='total_bill',y='day',
col='smoker',
kind='box',data=data) #绘制箱型图
plt.show()
直方图与密度图
直方图常用于表示频率图,而密度图又被称为核密度估计(KDE)。
data.loc[:,'size'].plot.hist(bins=6)
plt.show()
data.loc[:,'size'].plot.density()
plt.show()
同样的,seaborn的distplot()方法使得绘制直方图与密度图更简单:
dis_1=np.random.normal(0,1,size=200)
dis_2=np.random.normal(10,2,size=200)
data=pd.Series(np.concatenate([dis_1,dis_2]))
sns.distplot(data,bins=100,color='k')
plt.show()
散点图
散点图常用来考察多个变量之间的关系。
macro=pd.read_csv('examples/macrodata.csv')
macro.sample(5)
data=macro.loc[:,['cpi','m1','tbilrate','unemp']]
trans_data=np.log(data).diff().dropna() #diff():后一个元素减前一个元素
trans_data.sample(5)
sns.regplot('m1','unemp',data=trans_data) #带回归拟合的散点图
plt.show()
在分析数据时,同时绘制不同变量组合下的散点图是很有用的,这被称为散点图矩阵:
sns.pairplot(trans_data,diag_kind='kde',plot_kws={'color':'k','alpha':0.5}) #对角线设为密度图
plt.show()