如何使用Matplotlib使两个标记共享图例中的相同标签?

如何使用Matplotlib使两个标记共享图例中的相同标签?

背景

在Matplotlib中通过使用legend()函数可以创建图例。当我们对不同数据集分别进行绘制时,将图例放在同一图中可以更好地比较不同集的数据。但是,有时我们可能需要将相同标签的数据集分别绘制在不同的图中,以便进行更详细的比较。这时,我们可能会遇到一个问题:如何让多个标记共享相同的图例?

考虑以下示例代码,用于将两个地区的GDP数据集绘制到两个图中,每个图中一个地区的数据集。我们希望将这两个标记的图例合并在一起,以便更容易地进行比较。

import matplotlib.pyplot as plt
import numpy as np

# 创建数据集
years = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017]
regions = ['East', 'West']
east_gdp = [10, 12, 15, 18, 22, 24, 25, 26]
west_gdp = [8, 10, 13, 16, 20, 22, 23, 24]

# 创建两个图
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 5))

# 绘制数据到图1
ax1.plot(years, east_gdp, label='East')
ax1.set_xlabel('Year')
ax1.set_ylabel('GDP')
ax1.set_title('East GDP')

# 绘制数据到图2
ax2.plot(years, west_gdp, label='West')
ax2.set_xlabel('Year')
ax2.set_ylabel('GDP')
ax2.set_title('West GDP')

# 显示图例
ax1.legend(loc='best')
ax2.legend(loc='best')

# 显示图形
plt.show()

运行代码,结果会生成两个图形窗口,分别显示每个地区的GDP数据。每个图形都包含相同的标签“East”和“West”,但是它们分别属于不同的图例。我们需要将它们合并成一个图例。

解决方案

要合并这两个标记的图例,我们可以首先创建一个空图,并将每个图的图例传递给它。然后,我们可以手动将每个标记添加到一个新的图例中,这个新图例将进一步作为合并后的图例显示。以下是代码:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据集
years = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017]
regions = ['East', 'West']
east_gdp = [10, 12, 15, 18, 22, 24, 25, 26]
west_gdp = [8, 10, 13, 16, 20, 22, 23, 24]

# 创建两个图
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 5))

# 绘制数据到图1
ax1.plot(years, east_gdp, label='East')
ax1.set_xlabel('Year')
ax1.set_ylabel('GDP')
ax1.set_title('East GDP')

# 绘制数据到图2
ax2.plot(years, west_gdp, label='West')
ax2.set_xlabel('Year')
ax2.set_ylabel('GDP')
ax2.set_title('West GDP')

# 合并图例
fig.legend(handles=ax1.get_legend_handles_labels()[0], labels=ax1.get_legend_handles_labels()[1] + ax2.get_legend_handles_labels()[1], 
           loc='best')

# 显示图形
plt.show()

在这里,我们首先创建了一个新的空图,然后使用图1和图2的图例句柄和标签列表将它们加在一起。请注意,get_legend_handles_labels()函数返回一个含有两个值的元组,第一个值是图例句柄的列表,第二个是标签的列表。我们将图1的句柄传递给handles参数,将图1和图2的标签列表加在一起并传递给labels参数,最后设置合适的位置(’best’)来显示图例。

运行代码,现在我们可以看到一个新的窗口显示出已合并的图例。这个新图例还包含行链接,以便更清楚地区分颜色和标签。

完整代码

下面是完整的示例代码:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据集
years = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017]
regions = ['East', 'West']
east_gdp = [10, 12, 15, 18, 22, 24, 25, 26]
west_gdp = [8, 10, 13, 16, 20, 22, 23, 24]

# 创建两个图
fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(10, 5))

# 绘制数据到图1
ax1.plot(years, east_gdp, label='East')
ax1.set_xlabel('Year')
ax1.set_ylabel('GDP')
ax1.set_title('East GDP')

# 绘制数据到图2
ax2.plot(years, west_gdp, label='West')
ax2.set_xlabel('Year')
ax2.set_ylabel('GDP')
ax2.set_title('West GDP')

# 合并图例
fig.legend(handles=ax1.get_legend_handles_labels()[0], labels=ax1.get_legend_handles_labels()[1] + ax2.get_legend_handles_labels()[1], 
           loc='best')

# 显示图形
plt.show()

结论

在Matplotlib中,我们可以创建图例来比较不同的数据集。但是,在将相同标签的数据集分别绘制在不同的图中时,我们需要将它们的图例合并在一起。本文介绍了如何使用Matplotlib创建空图并将多个图例合并到一起的方法。通过使用这个方法,我们可以更直接地比较相同标签的数据集。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程