📜  水平子图 (1)

📅  最后修改于: 2023-12-03 15:26:55.124000             🧑  作者: Mango

水平子图

水平子图是数据可视化中常用的一种展示方式。通过将多个水平方向上的子图放置在同一个图中,可以方便地比较不同数据集之间的差异或相似性。本文将介绍如何使用Python的Matplotlib库创建水平子图。

创建水平子图

使用Matplotlib库创建水平子图,需要先创建一个画布和若干个子图。以下是创建画布和子图的代码:

import matplotlib.pyplot as plt

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 4))

以上代码创建了一个水平方向上有3个子图的画布,每个子图的宽度为4英寸,高度为12英寸。子图对象存储在名为ax的数组中。

绘制水平子图

得到子图对象后,可以在每个子图上绘制图形。以下是在第一个子图上绘制水平条形图的代码示例:

import numpy as np

data = np.random.rand(10) * 100
y_pos = np.arange(len(data))

ax[0].barh(y_pos, data, align='center')
ax[0].set_yticks(y_pos)
ax[0].set_yticklabels(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])
ax[0].invert_yaxis()  # 显示y轴标签顺序
ax[0].set_xlabel('Value')
ax[0].set_title('Horizontal Bar Chart')

以上代码首先生成了一个长度为10的随机数列作为要绘制的数据,然后使用barh函数在第一个子图上绘制水平条形图,其中y_pos是y轴标签的位置,align参数指定标签对齐方式。最后,使用set_xticks、set_xticklabels、invert_yaxis、set_xlabel和set_title等函数设置图形的各种属性,以便更好地呈现数据。

在子图之间共享轴标签

为了更好地比较子图之间的数据,有时需要共享y轴或x轴标签。以下是在第二个子图上绘制散点图,并共享y轴标签的代码:

x = np.random.rand(100)
y = np.random.rand(100)

ax[1].scatter(x, y)
ax[1].set_yticks(y_pos)
ax[1].set_yticklabels(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])
ax[1].invert_yaxis()
ax[1].set_xlabel('X')
ax[1].set_ylabel('Y')
ax[1].set_title('Scatter Plot')
ax[1].sharey(ax[0])  # 共享y轴标签

以上代码使用scatter函数在第二个子图上绘制随机散点图,并使用sharey函数共享y轴标签。这样,两个子图的y轴标签就是相同的,便于进行比较。

结合子图

除以上方法外,还可以使用subplot2grid函数创建自定义排列的子图。以下是创建连续的两个子图的代码:

ax1 = plt.subplot2grid((1, 2), (0, 0))
ax2 = plt.subplot2grid((1, 2), (0, 1))

ax1.barh(y_pos, data, align='center')
ax1.set_yticks(y_pos)
ax1.set_yticklabels(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])
ax1.invert_yaxis()
ax1.set_xlabel('Value')
ax1.set_title('Horizontal Bar Chart')

ax2.scatter(x, y)
ax2.set_yticks(y_pos)
ax2.set_yticklabels(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'])
ax2.invert_yaxis()
ax2.set_xlabel('X')
ax2.set_ylabel('Y')
ax2.set_title('Scatter Plot')
ax2.sharey(ax1)

绘制子图的方法依然和前面一样,但使用subplot2grid函数可以更灵活地排列子图。第一个参数指定画布被分成的行和列数,而第二个参数则指定子图在画布中的位置。例如,(1, 2)表示画布中分成1行2列,(0, 0)表示子图从第0行第0列开始。

结论

通过以上介绍,我们可以看到,水平子图是非常有用的数据可视化技巧,可以方便地对比不同数据集之间的差异或相似性。使用Matplotlib库,可以轻松创建水平子图,而且可以通过设置不同的属性,使图表更具吸引力和易读性。