9.1简明matplotlib API入门 9.1.1图片与子图 matplotlib绘制的图位于图片(Figure)对象中,使用plot.figure生成一个新图 fig = plt.figure()#不会有任何显示,无法用空白的图片绘图 需要使用add_subplot创建一个或者多个子图(subplot) fig = plt.figure()
<matplotlib.figure.Figure at 0x19a8bfcdc18>
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)#返回的对象是Axes Subplot
plt.plot([1.5,3.5,-2,1.6])
plt.plot(np.random.randn(50).cumsum(),'k--')#'k--'确定划线的黑色线的风格,
matplotlib库中包含一个方法:plt.subplots(创建一个新的图片,然后返回包含了已经生成子图对象的Numpy数组) fig, axes = plt.subplots(2, 3)
axes
out[19]array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d010311d0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00f33400>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00edb940>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00f01eb8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00eb1470>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7f7d00e599e8>]],
dtype=object)
表9-1. pyplot.subplots选项 9.1.1.1调整子图周围的间距 默认情况下,matplotlib会在子图的外部和子图之间留出一定的间距,但可以利用GUI窗口调整图的大小 subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None) #wspace,hspace分别控制图像的宽和高百分比 fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
for j in range(2):
axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)
9.1.2颜色,标记和线类型 ax.plot(x,y,'g--')#直接通过字符串指定颜色和线型 ax.plot(x,y,linestyle='--',color='g') 折线图可以标记凸显实际的数据点 from numpy.random import randn
plt.plot(randn(30).cumsum(),'ko--')
#上面一句代码可以更加显示的写成:
#plot(randn(30).cumsum,color='k',linestyle='dashed',marker='o')
data = randn(30).cumsum()
plt.plot(data,'k--',label='Default')
plt.plot(data,'k-',drawstyle='steps-post',label='steps-post')
9.1.3刻度,标签和图例 对于大多数的图表装饰项,主要实现方式有两种:使用过程型的pyplot接口(MATLAB)以及面向对象的原生matplotlib API pyplot接口的设计目的就是交互式使用,含有诸如xlim,xticks,xticklabels之类的方法 它们分别控制图表的范围,刻度位置,刻度标签,使用方法有两种: 1,调用时不带参数,则返回当前的参数值:plt.xlim()返回当前X轴绘图范围 2,调用时带参数,设置参数值,则,plt.xlim([0,10])会将X轴的范围设置为0,10 9.1.3.1设置标题,轴标签,刻度和刻度标签 修改X轴的刻度,set_xticks(将刻度放在数据范围的哪些位置,默认刻度也是位置的标签) set_xticklabels(将任何其他值用作标签) fig = plt.figure()
ax=fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum())
ticks = ax.set_xticks([0,250,500,750,1000])
labels = ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')
ax.set_title('My first matplotlib plot')
ax.set_xlabel('Stages')
9.1.3.2添加图例 图例(legend)是另外一种用于标识图表元素的重要工具。 添加subplot的时候传入label参数 fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum(),'k',label='one')
ax.plot(randn(1000).cumsum(),'k--',label='two')
ax.plot(randn(1000).cumsum(),'k.',label='three')
ax.legend(loc='best')
9.1.4注释与子图加工 想要在图表上添加自己的注释,注释中可能含有各种文本,箭头,图形 可以使用text,arrow,annote来添加注释和文本 text在文本上给定的坐标(x,y), ax.text(x,y,'hello,world',family='monospace',fontsize=10) 9.1.5将图片保存到文件 利用plt.savefig可以将当前图表保存到文件,此方法相当于Figure对象的实例方法savefig 例如,要将图表保存为SVG文件,只需输入:plt.savefig('figpath.svg') 文件类型是通过文件的拓展名推荐出来的 最常用到的两个重要的选项是dpi(控制“每英寸点数”分辨率)和box_inches(剪除当前图表周围的空白部分) 比如,要得到一张最小白边且分辨率为400DPI的PNG图片: plt.savefig('figpath.png',dpi=400,bbox_inches='tight') savefig并非一定要写入磁盘,也可以写入任何文件型的对象,比如string10: from io import BytesIO buffer=BytesIO plt.savefig(buffer) plot_data=buffer.getvalue()
9.1.6 matplotlib设置 图片的大小,边距,配色方案,字体大小,网络类型都可以通过全局参数自定义 操作matplotlib配置系统的方式有两种: 第一种是python编程方式,rc方式,比如要将全局的图像默认大小设置为10*10 plt.rc('figure',figsize=(10,10)) 9.2使用pandas和seaborn绘图 matplotlib是相当底层的工具,要组装一张图表,你得用它的各种组件才行 数据展示:(图表的类型:线型图,柱状图,盒形图,散布图,等值线图),图例,标题,刻度标签等信息 9.2.1折线图 Series和DataFrame都有一个用于生成各类图标的plot方法,默认情况下plot()生成的是折线图 s = Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()#该serie的对象的索引会被传给matplotlib,并绘制X轴
pandas的大部分绘图方法都有一个可选的ax参数,他可以是一个matplotlib的subplot对象 DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例 import pandas as pd
df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),columns=['A', 'B', 'C', 'D'],index=np.arange(0, 100, 10))
df.plot()
简单的DataFrame的图的表示例
series.plot方法的参数
DataFrame的plot参数 9.2.2柱状图 plot.bar()和plot.barth()可以分别绘制垂直和水平的柱状图 在绘制柱状图时,Series和DataFrame的索引将会被用作X或者Y的刻度 fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)#alpha=0.7将柱子的颜色设置为部分透明
data.plot.barh(ax=axes[1], color='k', alpha=0.7)
df = pd.DataFrame(np.random.rand(6, 4),
....: index=['one', 'two', 'three', 'four', 'five', 'six'],
....: columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df.plot.bar()
DataFrame各列的名称“Genus”被用作图例的标题,设置stacked=True DataFrame生成堆积柱状图,这样每行的值就会被堆积在一起 df.plot.barh(stacked=True,alpha=0.5)
对于在绘图前需要聚合或者汇总的数据,使用seaborn包会使得工作更为简单 9.2.3直方图和密度图 直方图是一种可以对值频率进行离散化的柱状图 数据点被拆分到离散的,间隔均匀的面元中,绘制的是各面元中数据点的数量 distplot方法可以绘制直方图和连续密度估计,通过distplot方法seaborn使直方图和密度图的绘制更为简单 考虑由两个不同的标准正态分布组成的双峰分布: comp1 = np.random.normal(0,1,size=200)
comp2 = np.random.normal(10,2,size=200)
values = pd.Series(np.concatenate([comp1,comp2]))
sns.distplot(values,bins=100,color='k')
9.2.4散点图或点图 点图或者散点图用于检验两个一维数据序列之间的关系 seaborn的regplot方法,该方法可以绘制散点图,并拟合出一条线性回归线 9.2.5分面网格和分类数据 如果数据集和额外的分组维数,使用分面网络是利用多种分组变量对数据进行可视化的方法 seaborn拥有一个有效的内建函数factorplot,它可以简化多种分面绘图