matplotlib的图像位于Figure对象中,创建Figure
fig = plt.figure()
不能通过空Figure绘图,必须为其创建subplot
ax1 = fig.add_subplot(2, 2, 1)
上面参数表示,图像是2x2,选中4个subplot中的第1个。
创建另外两个subplot
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
如果此时发出绘图命令,matplotlib会在最后一个用过的subplot上绘制
from numpy.random import randn
plt.plot(randn(50).cumsum(), 'k--')
k--是线型选项,此处是黑色虚线图。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))
更为方便的方法
fig, axes = plt.subplots(2, 3)
调整subplot周围的间距
默认,matplotlib会在subplot外围留下一定的边距,并在subplot之间留下一定间距
plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
wspace=None, hspace=None)
下面例子将边距收缩为0
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)
颜色、标记、线型
matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串缩写。
根据x和y绘制绿色虚线
ax.plot(x,y,'g--')
ax.plot(x,y,linestyle='--',color='g')
标记也可以放到格式字符中,标记类型和线型必须放在颜色后面
plt.plot(randn(30).cumsum(), 'ko--')
更为明确的形式是
plot(randn(30).cumsum(),color='k',linestyle='dashed',marker='o')
在线型图中,非实际数据点默认是按照线性方式插值的,可以通过drawstyle选项修改
data = randn(30).cumsum()
plt.plot(data, 'k--', label='Default')
plt.plot(data, 'k-', drawstyle='steps-post', label='steps-post')
plt.legend(loc='best')
刻度、标签和图例
对大多数图标装饰项,主要有两种实现方式:
过程型pyplot接口
面向对象的原生matplotlib API
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')
添加图例
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')
主机以及在Subplot上绘图
注解可以通过text、arrow和annotate等函数添加
from datetime import datetime
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
data = pd.read_csv('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')
# Zoom in on 2007-2010
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 1800])
ax.set_title('Important dates in 2008-2009 financial crisis')