子区函数subplot()的三个参数分别是整数C、整数R和整数P,表示在C行、R列的网格布局上,子区subplot()会被放置在第P个位置上,即为将被创建的子区编号,子区编号从1开始,起始于右上角,序号依次向右递增。也就是说,每行的子区位置都是从左向右进行升序计数的,subplot(2,3,4)是第2行的第1个子区也可以写作subplot(234)。
参考这篇文章第3节的作图
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
x = np.linspace(0.0, 2*np.pi)
y = np.cos(x)*np.sin(x)
ax1 = fig.add_subplot(121)
ax1.margins(0.03)
ax1.plot(x, y, ls='-', lw=1, c='b')
ax2 = fig.add_subplot(222)
ax2.margins(0.7, 0.7)
ax2.plot(x, y, ls='-', lw=2, c='r')
ax3 = fig.add_subplot(224)
ax3.margins(x=0.1, y=0.3)
ax3.plot(x, y, ls='-', lw=3, c='g')
plt.show()
其中margins(m)设置数据范围的空白区域,m倍的数据区间会被添加到x轴y轴两端。m取值范围是大于-0.5的任意浮点数。负数的情况就是只能看见部分图像,像放大了的感觉。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
plt.subplot2grid((2, 3), (0, 0), colspan=2)
x = np.linspace(-1.0, 5.0, 100)
y = np.random.randn(100)
plt.scatter(x, y, c='c')
plt.title('散点图')
plt.subplot2grid((2, 3), (0, 2))
plt.title('空白区域')
plt.subplot2grid((2, 3), (1, 0), colspan=3)
x = np.linspace(0.0, 4.0, 100)
y1 = np.sin(x)
plt.plot(x, y1, lw=2, ls='-')
plt.xlim(0, 3)
plt.grid(True, ls=":", c='r')
plt.title("折线图")
plt.suptitle("subplot2grid()函数的实例展示")
plt.show()
函数subplot2grid(shape, loc)。shape就表示几行几列的网格布局,loc表示以第几行第几列为起点(从0算起哦),colspan表示横跨多少列,当然就有rowspan表示横跨多少行。
by the way,函数suptitle()指绘制Figure画布(就是整张图片标题)标题的文本内容,函数title()绘制Axes实例(就是每一个小图像的标题)的图形标题文本。
和2有点异曲同工的味道,但是更加灵活。
函数subplots()的返回值是一个( fig, ax)元组,其中,fig是Figure实例,ax可以是一个axis对象,如果是多个子区被创建,那么ax可以是一个axis对象数组。因此,使用函数subplots()可以创建一张画布带有多个子区的绘图模式的网格布局。
比如通过调用函数subplots(1,2),生成一个画布对象和一个坐标轴实例数组,画布对象和实例数组分别存储在变量fig和ax中。然后分别在坐标轴axl和坐标轴ax2上绘制图。
如果我们想要改变子区边缘相距画布边缘的距离和子区边缘之间的高度与宽度的距离,可以调
用函数subplots _adjust(*agrs,**kwargs)进行设置, 其中的关键字参数left、right、 bottom、top、 hspace和wspace都有默认值,而且是使用Axes坐标轴系统度量的,即使用闭区间[0,1]的浮点数,前四个关键字参数可以调节子区距离画布的距离,关键字参数wspace控制子区之间的宽度距离,关键字参数hspace控制子区之间的高度距离。因此,借助函数subplots adjust0可以有效实现子区的画布布局的空间位置的调整。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(2, 3)
# 231
colors = ['#8dd3c7', '#ffffb3', '#bebada']
ax[0, 0].bar([1, 2, 3], [0.6, 0.2, 0.8], color=colors, width=0.5, hatch='///', align='center')
ax[0, 0].errorbar([1, 2, 3], [0.6, 0.2, 0.8], yerr=0.1, capsize=0, ecolor='#377eb8', fmt="o:")
ax[0, 0].set_ylim(0, 1.0)
# 232
ax[0, 1].errorbar([1, 2, 3], [20, 30, 36], xerr=2, ecolor='#4daf4a', elinewidth=2, fmt='s', label='ETN')
ax[0, 1].legend(loc=3, fancybox=True, shadow=True, fontsize=10, borderaxespad=0.4)
ax[0, 1].set_ylim(10, 40)
ax[0, 1].set_xlim(-2, 6)
ax[0, 1].grid(ls=':', lw=1, color='grey', alpha=0.5)
# 233
x3 = np.arange(1, 10, 0.5)
y3 = np.cos(x3)
ax[0, 2].stem(x3, y3, basefmt='r-', linefmt='b-.', markerfmt='bo', label='life signal')
ax[0, 2].legend(loc=2, fontsize=8, frameon=False, borderpad=0.0, borderaxespad=0.6)
ax[0, 2].set_xlim(0, 11)
ax[0, 2].set_ylim(-1.1, 1.1)
# 234
x4 = np.linspace(0, 2*np.pi, 500)
x4_1 = np.linspace(0, 2*np.pi, 1000)
y4 = np.cos(x4)*np.exp(-x4)
y4_1 = np.sin(2*x4_1)
line1, line2, = ax[1, 0].plot(x4, y4, 'k--', x4_1, y4_1, 'r-', lw=2)
ax[1, 0].legend((line1, line2), ('energy', 'patience'), loc='upper center', fontsize=8, ncol=2, framealpha=0.3,
mode='expand', columnspacing=2, borderpad=0.1)
ax[1, 0].set_ylim(-2, 2)
ax[1, 0].set_xlim(0, 2*np.pi)
# 235
x5 = np.random.rand(100)
ax[1, 1].boxplot(x5, vert=False, showmeans=True, meanprops=dict(color='g'))
ax[1, 1].set_yticks([])
ax[1, 1].set_xlim(-1.1, 1.1)
ax[1, 1].set_ylabel("Micro SD Card")
ax[1, 1].text(-1.0, 1.2, 'net weight', fontsize=20, style='italic', weight='black', family='monospace')
# 236
mu = 0.0
sigma = 1.0
x6 = np.random.randn(10000)
n, bins, patches = ax[1, 2].hist(x6, bins=30, histtype='stepfilled', cumulative=True, density=True,
color='cornflowerblue', label='Test')
y = ((1/(np.sqrt(2*np.pi)*sigma))*np.exp(-0.5*(1/sigma*(bins-mu))**2))
y = y.cumsum()
y /= y[-1]
ax[1, 2].plot(bins, y, 'r--', linewidth=1.5, label='Theory')
ax[1, 2].set_ylim(0.0, 1.1)
ax[1, 2].grid(ls=":", lw=1, c='grey', alpha=0.5)
ax[1, 2].legend(loc='upper left', fontsize=8, shadow=True, framealpha=0.8)
plt.subplots_adjust()
plt.show()
参考书目《Python数据可视化之matplotlib实践》