matplotlib划分画布(划分子区域)

文章目录

    • 1.等分画布subplot()
    • 2.非等分区域上展示图形(实例方法add_subplot())
    • 3.定制网格区域subplot2grid()(也是非等分区域上展示图形)
    • 4.画布中多个子区域绘图(等分)subplots()


1.等分画布subplot()

子区函数subplot()的三个参数分别是整数C、整数R和整数P,表示在C行、R列的网格布局上,子区subplot()会被放置在第P个位置上,即为将被创建的子区编号,子区编号从1开始,起始于右上角,序号依次向右递增。也就是说,每行的子区位置都是从左向右进行升序计数的,subplot(2,3,4)是第2行的第1个子区也可以写作subplot(234)。
参考这篇文章第3节的作图

2.非等分区域上展示图形(实例方法add_subplot())

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的任意浮点数。负数的情况就是只能看见部分图像,像放大了的感觉。
matplotlib划分画布(划分子区域)_第1张图片

3.定制网格区域subplot2grid()(也是非等分区域上展示图形)

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实例(就是每一个小图像的标题)的图形标题文本。

4.画布中多个子区域绘图(等分)subplots()

和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()

matplotlib划分画布(划分子区域)_第2张图片

  • 在子区subplot(231)中,我们绘制了包含误差棒的柱状图,而且柱状图带有“斜线”的几何图案。误差棒的方向是垂直x轴的,误差棒之间使用虚线连接。
  • 在子区subplot(232)中,我们绘制了水平方向的误差棒。同时,使用关键字参数ecolor和elinewidth调整了误差棒的颜色和线宽。我们将图例放在左下角,而且借助关键字参数borderaxespad将图例与坐标轴的空白距离进行调整。图例的外边框使用圆角形式进行展示。使用实例方法grid()调整了线条样式、线宽、线条颜色和网格透明度的网格线,以求凸显误差棒的度量精度。
  • 在子区subplot(233),我们绘制了棉棒图,同时调整了棉棒图的组成元素的样式属性值。 我们将图例放在左上角,而且使用关键字参数framen将图例的边界框去掉。调整图例内部的空白距离和图例与坐标轴之间的空白距离。
  • 在子区subplot(234)中, 我们使用实例方法plot)同时绘制了两条折线,而且对折线的颜色、线
    型和线宽进行了调整。使用变量line1 和line2,用来存储实例Line2D 组成的列表里的实例Line2D元素。在图例中,我们将实例line1和实例line2与图例条目文本内容对应放在实例方法legend()中,同时使用关键字参数framealpha调整了图例背景的透明度,而且使用关键字参数mode将图例中的条目文本并排水平放置。
  • 在子区subplot(235)中,我们绘制了水平放置的箱线图,同时向图中添加了文本内容作为注释,文本内容简单地进行了文本样式和字体的调整。
  • 在子区subplot(236)中,我们绘制了累积(cumulative=True)的阶梯填充型直方图,而且用频率
    或者称为密度的数值(density=True才行 normed=True会报错 )进行直方图高度的标示。在此基础上,绘制了正态分布的根率密度曲线。

参考书目《Python数据可视化之matplotlib实践》

你可能感兴趣的:(matplotlib)