plt画网格图_Matplotlib 多子图绘制

plt画网格图_Matplotlib 多子图绘制_第1张图片

多个子图:


有时,并排比较不同的数据视图会很有帮助。为此,Matplotlib具有子图的概念:可以在单个图中一起存在的较小轴组。这些子图可能是插图,图形网格或其他更复杂的布局。在本节中,我们将探讨在Matplotlib中创建子图的四个例程。

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np

plt.axes:手绘子图

创建轴的最基本方法是使用该plt.axes功能。正如我们之前所见,默认情况下,这会创建一个填充整个图形的标准轴对象。 plt.axes还有一个可选参数,它是图坐标系中四个数字的列表。这些数字表示[left, bottom, width, height]在图形坐标系中,其范围从图的左下角的0到图的右上角的1。

例如,我们可以通过将xy位置设置为0.65(即,从宽度的65%和图的高度的65%开始)在另一个轴的右上角创建一个插入轴,并且xy范围为0.2(也就是说,轴的大小是宽度的20%和图的高度的20%):

ax1 = plt.axes()  # standard axes
ax2 = plt.axes([0.65, 0.65, 0.2, 0.2])

plt画网格图_Matplotlib 多子图绘制_第2张图片

在面向对象的接口中等效于此命令fig.add_axes()。让我们用它来创建两个垂直堆叠的轴:

fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.5, 0.8, 0.4],
                   xticklabels=[], ylim=(-1.2, 1.2))
ax2 = fig.add_axes([0.1, 0.1, 0.8, 0.4],
                   ylim=(-1.2, 1.2))

x = np.linspace(0, 10)
ax1.plot(np.sin(x))
ax2.plot(np.cos(x));

plt画网格图_Matplotlib 多子图绘制_第3张图片

我们现在有两个刚刚接触的轴(顶部没有刻度标签):上面板的底部(位置0.5)与下面板的顶部(位置0.1 + 0.4)相匹配。

plt.subplot:子图的简单网格


对齐的列或行的子图是一个常见的需求,Matplotlib有几个方便的例程,使它们易于创建。其中最低级别是plt.subplot()在网格中创建单个子图。如您所见,此命令采用三个整数参数 - 行数,列数和要在此方案中创建的绘图的索引,从左上角到右下角:

for i in range(1, 7):
    plt.subplot(2, 3, i)
    plt.text(0.5, 0.5, str((2, 3, i)),
             fontsize=18, ha='center')

plt画网格图_Matplotlib 多子图绘制_第4张图片

该命令plt.subplots_adjust可用于调整这些图之间的间距。以下代码使用等效的面向对象的命令fig.add_subplot()

fig = plt.figure()
fig.subplots_adjust(hspace=0.4, wspace=0.4)
for i in range(1, 7):
    ax = fig.add_subplot(2, 3, i)
    ax.text(0.5, 0.5, str((2, 3, i)),
           fontsize=18, ha='center')

plt画网格图_Matplotlib 多子图绘制_第5张图片

我们使用了hspace和子wspace参数plt.subplots_adjust来指定沿着图的高度和宽度的间距,以子图大小为单位(在这种情况下,空间是子图宽度和高度的40%)。

plt.subplots:一次性整个网格


在创建大型子图网格时,刚才描述的方法会变得相当繁琐,特别是如果您想隐藏内部图上的x轴和y轴标签。为此,plt.subplots()使用起来更容易(注意s最后subplots)。该函数不是创建单个子图,而是在一行中创建完整的子图网格,并将它们返回到NumPy数组中。该参数是行数和列数的数量,可选关键字一起sharexsharey,它允许你指定不同的轴之间的关系。
在这里,我们将创建一个2×3

fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')

plt画网格图_Matplotlib 多子图绘制_第6张图片

请注意,通过指定sharexsharey,我们已自动删除网格上的内部标签以使绘图更清晰。生成的轴实例网格在NumPy数组中返回,允许使用标准数组索引表示法方便地指定所需的轴:

# axes are in a two-dimensional array, indexed by [row, col]
for i in range(2):
    for j in range(3):
        ax[i, j].text(0.5, 0.5, str((i, j)),
                      fontsize=18, ha='center')
fig

plt画网格图_Matplotlib 多子图绘制_第7张图片

相比之下plt.subplot()plt.subplots()更符合Python传统的基于0的索引。

plt.GridSpec:更复杂的安排


超越常规网格到跨越多行和列的子图plt.GridSpec()是最好的工具。该plt.GridSpec()对象本身不会创建一个图; 它只是一个方便的界面,可以被plt.subplot()命令识别。例如,具有一些指定宽度和高度空间的两行和三列网格的gridspec如下所示:

grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3)

从这里我们可以使用familiary Python切片语法指定子图位置和范围:

plt.subplot(grid[0, 0])
plt.subplot(grid[0, 1:])
plt.subplot(grid[1, :2])
plt.subplot(grid[1, 2]);

plt画网格图_Matplotlib 多子图绘制_第8张图片

这种类型的柔性网格对齐具有广泛的用途。我最经常在创建多轴直方图时使用它,如下图所示:

# Create some normally distributed data
mean = [0, 0]
cov = [[1, 1], [1, 2]]
x, y = np.random.multivariate_normal(mean, cov, 3000).T

# Set up the axes with gridspec
fig = plt.figure(figsize=(6, 6))
grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2)
main_ax = fig.add_subplot(grid[:-1, 1:])
y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax)
x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax)

# scatter points on the main axes
main_ax.plot(x, y, 'ok', markersize=3, alpha=0.2)

# histogram on the attached axes
x_hist.hist(x, 40, histtype='stepfilled',
            orientation='vertical', color='gray')
x_hist.invert_yaxis()

y_hist.hist(y, 40, histtype='stepfilled',
            orientation='horizontal', color='gray')
y_hist.invert_xaxis()

plt画网格图_Matplotlib 多子图绘制_第9张图片

这种类型的分布与其边缘一起绘制是很常见的,它在Seaborn包中有自己的绘图API;有关详细信息,请参阅使用Seaborn进行可视化

你可能感兴趣的:(plt画网格图)