📅  最后修改于: 2023-12-03 15:08:42.972000             🧑  作者: Mango
在 Matplotlib 中创建多个子图和为每个子图添加一个图例是很常见的任务。然而,有时候,我们可能需要为所有子图共享一个图例,这样能更好地展示数据,并让读者更容易理解。
本文将介绍如何在 Matplotlib 中为所有子图创建单个图例。以下是需要跟随的步骤:
我们将从创建多个子图开始。以下是一个基本的例子:
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
axs[0, 0].plot([0, 1], [0, 1])
axs[0, 0].set_title('Plot 1')
axs[0, 1].plot([0, 1], [1, 0])
axs[0, 1].set_title('Plot 2')
axs[1, 0].plot([0, 1], [0, 2])
axs[1, 0].set_title('Plot 3')
axs[1, 1].plot([0, 1], [1, 1])
axs[1, 1].set_title('Plot 4')
plt.show()
此代码将创建一个 2 x 2 的子图,并在每个子图上绘制一个简单的线形图。
每个子图中的数据点都应该拥有唯一的标签和颜色,以便在图例中准确展示。我们可以在每个子图上定义它们的标签和颜色。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
axs[0, 0].plot([0, 1], [0, 1], label='Line 1', color='blue')
axs[0, 0].set_title('Plot 1')
axs[0, 1].plot([0, 1], [1, 0], label='Line 2', color='orange')
axs[0, 1].set_title('Plot 2')
axs[1, 0].plot([0, 1], [0, 2], label='Line 3', color='green')
axs[1, 0].set_title('Plot 3')
axs[1, 1].plot([0, 1], [1, 1], label='Line 4', color='red')
axs[1, 1].set_title('Plot 4')
plt.show()
此代码将为每个子图中的线条定义一个标签和颜色。
下一步是创建一个单独的图例,以便在所有子图中显示所有线条的标签和对应的颜色。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
axs[0, 0].plot([0, 1], [0, 1], label='Line 1', color='blue')
axs[0, 0].set_title('Plot 1')
axs[0, 1].plot([0, 1], [1, 0], label='Line 2', color='orange')
axs[0, 1].set_title('Plot 2')
axs[1, 0].plot([0, 1], [0, 2], label='Line 3', color='green')
axs[1, 0].set_title('Plot 3')
axs[1, 1].plot([0, 1], [1, 1], label='Line 4', color='red')
axs[1, 1].set_title('Plot 4')
# 创建单个图例
handles, labels = axs[0, 0].get_legend_handles_labels()
fig.legend(handles, labels, loc='center', frameon=False)
plt.show()
此代码将创建一个单独的图例,同时在子图 1,1 中获取线条的句柄和标签。我们将使用 fig.legend()
将图例放置在图形的中央,并将框架设置为不可见。
注意,在定义子图时,我们将其作为一个 2x2 的数组定义,因此 axs[0,0]
就表示子图的第一行和第一列。
最后一步是调整子图的大小和放置位置,以确保图例不会遮盖其它数据,而且整个图形尽可能地美观。我们可以使用 plt.subplots_adjust()
来完成这些任务。
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
axs[0, 0].plot([0, 1], [0, 1], label='Line 1', color='blue')
axs[0, 0].set_title('Plot 1')
axs[0, 1].plot([0, 1], [1, 0], label='Line 2', color='orange')
axs[0, 1].set_title('Plot 2')
axs[1, 0].plot([0, 1], [0, 2], label='Line 3', color='green')
axs[1, 0].set_title('Plot 3')
axs[1, 1].plot([0, 1], [1, 1], label='Line 4', color='red')
axs[1, 1].set_title('Plot 4')
# 创建单个图例
handles, labels = axs[0, 0].get_legend_handles_labels()
fig.legend(handles, labels, loc='center', frameon=False)
# 调整子图大小和间距
plt.subplots_adjust(wspace=0.3, hspace=0.3)
axs[0, 0].set_position([0.1, 0.55, 0.35, 0.35])
axs[0, 1].set_position([0.55, 0.55, 0.35, 0.35])
axs[1, 0].set_position([0.1, 0.1, 0.35, 0.35])
axs[1, 1].set_position([0.55, 0.1, 0.35, 0.35])
plt.show()
此代码将调整每个子图的大小和放置位置,并设置子图之间的距离。我们将使用 .set_position()
将每个子图放置在不同的位置上。
现在您已经学会了如何在 Matplotlib 中为所有子图创建单个图例。使用这些技巧,您可以在创建复杂的可视化方案时更容易展示数据,并让您的图形更加专业。