matplotlib AIP入门
1.Figure和Subplot
matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure:
fig=plt.figure()
这时会弹出一个空窗口。plt.figure有一些选项,特别是figsize,它用于确保图片保存到磁盘时具有一定大小和纵横比。matplotlib中的Figure还支持一种MATLAB式的编号架构(例如plt.figure(2))。通过plt.gcf()即可得到当前Figure的引用。
不能通过空Figure绘图。必须用add_subplot创建一个或多个subplot才行
ax1=fig.add_subplot(2,2,1)
这段代码的意思是:图像应该是2*2的,且当前选中的是4个subplot中的第一个(编号从1开始)。如果再把后面两个subplot也创建出来,最终得到的图像如图所示
ax2=fig.add_subplot(2,2,2)
ax3=fig.add_subplot(2,2,3)
如果这时发出一条绘图命令(plt.plot(randn(50).cumsum(),'k--')),matplotlib就会在最后一个用过的subplot(如果没有则创建一个)上进行绘制
from numpy.random import randn
plt.plot(randn(50).cumsum(),'k--')
结果为:
‘k--’是一个线型选项,用于告诉matplotlib绘制黑色虚线图。上面那些由fig.add_subplot所返回的对象是AxesSubplot对象,直接调用它们的实例方法就可以在其它空着的格子里画图了
_=ax1.hist(randn(100),bins=20,color='k',alpha=0.3)
ax2.scatter(np.arange(30),np.arange(30)+3*randn(30))
结果为:
由于根据特定布局创建Figure和subplot是一件非常常见的任务,于是便出现了一个更为方便的方法(plt.subplots),它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组
fig,axes=plt.subplots(2,3)
print axes
结果为:
[[
[
你可以轻松地对axes数组进行索引,就好像一个二维数组一样,例如,axes[0,1]。你还可以通过sharex和sharey指定subplot应该具有相同的X轴或Y轴。
2.调整subplot周围的间距
利用Figure的subplots_adjust方法可以轻而易举地修改间距,它是个顶级函数
subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None)
wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距
fig,axes=plt.subplots(2,2,sharex=True,sharey=True)
for i in range(2):
for j in range(2):
axes[i,j].hist(randn(500),bins=50,color='k',alpha=0.5)
plt.subplots_adjust(wspace=0,hspace=0)
结果为:
3.颜色、标记和线型
例如,要根据x和y绘制绿色虚线,可以执行如下代码
ax.plot(x,y,'g--')
通过下面这种更为明确的方式也能得到同样的效果
ax.plot(x,y,linesytle='--',clolor='g')
使用颜色也可以指定其RGB值的形式使用,如#CECECE
线形图还可以加上一些标记,以强调实际的数据点。标记也可以放到格式化字符串中,但标记类型和线型必须放在颜色后面
plt.plot(randn(30).cumsum(),'ko--')
结果为:
还可以将其写成更为明确的形式
plt.plot(randn(30).cumsum(),color='k',linestyle='dashed',marker='o')
在线型图中,非实际数据点默认按线性方式插值的。可以通过drawstyle选项修改
plt.plot(data,'k--',label='Default')
结果为:
plt.plot(data,'k-',drawstyle='steps-post',label='steps-post')
结果为:
plt.legend(loc='best')
结果为:
4.刻度、标签和图例
对于大多数图表装饰项,其主要实现方式有二:使用过程型的pyplot接口(MATLAB用户非常熟悉)以及面向对象的原生matplotlib API
pyplot接口其主要使用方式有以下两种:
a.调用时不带参数,则返回当前的参数值。例如,plt.xlim()返回当前的X轴绘图范围。
b.调用时带参数,则设置参数值。因此,plt.xlim([0,10])会将X轴的范围设置为0到10
所有这些方法都是对当前或最近创建的AxesSubplot起作用的。它们各自对应subplot对象上的两个方法,以xlim为例,就是ax.get_xlim和ax.set_xlim。
设置标题、轴标签、刻度以及刻度标签
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')
结果为:
添加图例
添加图例的方式有两种。最简单的是在添加subplot的时候传入label参数
fig1=plt.figure()
ax1=fig1.add_subplot(1,1,1)
ax1.plot(randn(1000).cumsum(),'k',label='one')
ax1.plot(randn(1000).cumsum(),'k--',label='two')
ax1.plot(randn(1000).cumsum(),'k.',label='three')
ax1.legend(loc='best')
结果为:
loc告诉matplotlib要将图例放在哪。要从图例中去除一个或多个元素,不传入label或label='_nolegned_'即可
4.注解以及在Subplot上绘图
注解可以通过text、arrow和annotate等函数进行添加
ax.text(x,y,'Hello world!',family='monospace',fontsize=10)
实际案例
import matplotlib.pyplot as plt
from numpy.random import randn
import numpy as np
from datetime import datetime
import pandas as pd
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
data=pd.read_csv('data/spx.csv',index_col=0,parse_dates=True)
spx=data['SPX']
spx.plot(ax=ax,style='k-')
crisis_data=[
(datetime(2007,10,11),'Peak of bull market'),
(datetime(2008,3,12),'Bear Stearns Fails'),
(datetime(2008,9,15),'Lehman Bankruptcy')
]
for date,label in crisis_data:
ax.annotate(label,xy=(date,spx.asof(date)+50),
xytext=(date,spx.asof(date)+200),
arrowprops=dict(facecolor='black'),
horizontalalignment='left',verticalalignment='top')
ax.set_xlim(['1/1/2007','1/1/2011'])
ax.set_ylim([600,1800])
ax.set_title('Import dates in 2008-2009 financial crisis')
结果为:
要在图表中添加一个图形,你需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中
fig1=plt.figure()
ax1=fig1.add_subplot(1,1,1)
rect=plt.Rectangle((0.2,0.75),0.4,0.15,color='k',alpha=0.3)
circ=plt.Circle((0.7,0.2),0.15,color='b',alpha=0.3)
pgon=plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color='g',alpha=0.5)
ax1.add_patch(rect)
ax1.add_patch(circ)
ax1.add_patch(pgon)
结果为:
5.将图表保存到文件
利用plt.savefig可以将当前图表保存到文件。该方法相当于Figure对象的实例方法savefig。
在发布图片时最常用到两个最重要的选项是dpi(控制“每英寸点数”分辨率)和bbox_inches(可以剪除当前表周围的空白部分)
plt.savefig('figpath.png',dpi=400,bbox_inches='tight')
savefig并非一定要写入磁盘,也可以写入任何文件型对象,比如StirngIO
from io import StringIO
buffer=StringIO()
plt.savefig(buffer)
plot_data=buffer.getvalue()
6.matplotlib配置
操作matplotlib配置系统的方式主要有两种。第一种是Python编程方式,即利用rc方法。如:plt.rc('figure',figsize=(10,10))
rc的第一个参数是希望自定义的对象
font_options={'family':'monospace',
'weight':'bold',
'size':'small'}
plt.rc('font',**font_options)