Python多个子图共用一个图例的实现
在数据可视化中,常常需要将多个子图放在一张图中进行对比分析。为了使不同子图之间的关系更为明确,我们通常需要一个公共的图例,便于观众快速理解各个子图的含义。在这篇文章中,我们将使用Python中的Matplotlib库来实现多个子图共用一个图例,并通过一个实际的问题来展示这一过程。
实际问题
假设我们有三组不同的气温数据,分别代表三个不同城市在一周内的每日气温变化。我们想要将这三组数据放在同一图中,以便比较它们的气温趋势。显然,所有子图所使用的颜色和线型需要在一个统一的图例中注明。
解决方案
下面的代码将帮助你实现这一目标。我们将创建一个包含三个子图的图形,并在右侧添加一个统一的图例。
import matplotlib.pyplot as plt
import numpy as np
# 数据准备
days = np.arange(1, 8) # 1到7天
city1_temps = [22, 21, 23, 24, 26, 25, 27] # 城市1的气温
city2_temps = [20, 19, 22, 21, 23, 24, 20] # 城市2的气温
city3_temps = [25, 26, 27, 28, 29, 29, 30] # 城市3的气温
# 创建子图
fig, axs = plt.subplots(3, 1, figsize=(10, 10))
# 绘制城市1气温
axs[0].plot(days, city1_temps, label='城市1', color='r', marker='o')
axs[0].set_title('城市1气温变化')
axs[0].set_ylabel('气温 (°C)')
# 绘制城市2气温
axs[1].plot(days, city2_temps, label='城市2', color='g', marker='s')
axs[1].set_title('城市2气温变化')
axs[1].set_ylabel('气温 (°C)')
# 绘制城市3气温
axs[2].plot(days, city3_temps, label='城市3', color='b', marker='^')
axs[2].set_title('城市3气温变化')
axs[2].set_xlabel('天数')
# 添加统一图例
handles, labels = axs[0].get_legend_handles_labels()
fig.legend(handles, labels, loc='upper right')
# 显示图形
plt.tight_layout()
plt.show()
代码解析
-
数据准备:我们使用NumPy生成一个包含1到7的日数数组,并为每个城市产生一组气温数据。
-
创建子图:使用
plt.subplots()
生成三个子图,将其存储在数组axs
中。 -
绘制子图:分别为每个子图调用
plot()
方法,设置线条颜色、标记及图例标签。 -
添加统一图例:通过
get_legend_handles_labels()
方法提取第一个子图的图例信息,并利用fig.legend()
在整个图形中添加统一的图例,这样所有子图都能共用。
测试与展示
为了验证我们的实现是否有效,我们可以运行上面的代码,它将生成一张包含三个子图且具备统一图例的图形。你可以通过调整数据或风格来适应自己的需求。
sequenceDiagram
participant User
participant Plot
User->>Plot: 输入气温数据
Plot-->>User: 生成子图和统一图例
User->>Plot: 请求显示图形
Plot-->>User: 显示图形
结尾
使用Matplotlib库创建多个子图并共用一个图例,可以显著提升数据可视化的清晰度和美观性。通过上述的示例代码和步骤,你可以轻松地实现这一功能,从而在各种数据分析场景中提高可读性和专业性。希望这篇文章能为你的数据可视化工作提供帮助!