Matplotlib 添加项目横向而非纵向
在绘制图表时,图例是非常有用的工具,可以方便地告诉观察者哪些线条或图形代表哪些数据。但是,默认情况下,Matplotlib图例的条目是按列而非按行排列的,这使得它们在图中占据了大量的垂直空间。有时,我们希望能够将它们横向排列,以节省空间并增强可读性。在这篇文章中,我们将会研究如何在Matplotlib中将图例横向排列。
阅读更多:Matplotlib 教程
设置图例的列数
Matplotlib中的legend()函数带有一个默认值为1的ncol参数,该参数指定图例的列数。我们可以通过设置该参数来控制图例的横向排列。例如,如果我们想要一个具有两列的图例,我们可以写成:
plt.legend(ncol=2)
这将把图例分为两列。考虑下面这个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
x = np.linspace(0, 10, 1000)
y1 = np.sin(x)
y2 = np.sin(x + np.pi/4)
y3 = np.sin(x + np.pi/2)
y4 = np.sin(x + 3*np.pi/4)
# 绘制图表和图例
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='sin(x+pi/4)')
plt.plot(x, y3, label='sin(x+pi/2)')
plt.plot(x, y4, label='sin(x+3pi/4)')
plt.legend(ncol=2)
plt.show()
我们可以看到,图例条目现在已经逐行而非逐列排列,而且第一行只有两个条目(因为我们设置了两列)。
使用legend_handler自定义图例
有时,我们需要在图例中包含更复杂的元素,例如差异条或自定义文本标签。Matplotlib允许我们使用legend_handler参数来自定义这些元素的显示方式。我们可以将此参数设置为一个函数,该函数将在每个图例条目上调用,并返回要在图例中显示的自定义图形对象。
以下是一个简单的例子,说明如何使用legend_handler来创建包含自定义文本标签的图例:
import matplotlib.patches as mpatches
def text_handler(text, bounding_box, unused_legend):
"""自定义 文本 标签"""
return mpatches.FancyBboxPatch((bounding_box.x0, bounding_box.y0),
bounding_box.width, bounding_box.height,
boxstyle="round, pad=.3", ec="black",
fc="white", lw=2)
plt.plot([1, 2, 3], [1, 3, 2], label='line')
plt.legend(handler_map={mpatches.FancyBboxPatch: text_handler})
plt.show()
我们可以看到,图例现在包含了一个自定义文本标签。
ProxyArtist对象
Matplotlib还使用ProxyArtist对象来表示复杂的图形对象,例如误差棒或差异条。这些对象可以在图例中使用,就像图形本身一样。为了将ProxyArtist包含在图例中,我们需要使用legend_handler来创建一个返回该对象的函数。
这里是一个简单的例子,说明如何将误差线包含在图例中:
from matplotlib.lines import Line2D
from matplotlib.patches import Patch
def errorbar# Matplotlib图例:添加项目横向而非纵向(续)
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
y_error = 0.2 + 0.1*np.random.randn(len(y))
# 绘制误差线
fig, ax = plt.subplots()
ax.errorbar(x, y, yerr=y_error, fmt='o', color='b', ecolor='gray', elinewidth=3, capsize=0)
# 创建误差线的 ProxyArtist 对象
line = Line2D([0], [0], linestyle='none', marker='o', color='b', markersize=8)
errorbar = Patch(color='gray', lw=3)
# 使用 legend_handler 自定义图例条目
def errorbar_handler(errorbar, _):
"""自定义 误差线 标签"""
return errorbar
def line_handler(line, _):
"""自定义 点 标签"""
return line
# 绘制图例
plt.legend([(line, errorbar)],
['data: sin(x)\nerror: [0.2, 0.3, ...]'],
handler_map={Line2D: line_handler, Patch: errorbar_handler},
ncol=2)
plt.show()
我们可以看到,该图例包含图形本身,以及一个自定义的文本标签。我们使用Line2D和Patch类暂时创建并重用了的对象。
总结
在本文中,我们研究了如何在Matplotlib中将图例横向排列以释放垂直空间。我们还介绍了如何使用legend_handler自定义图例条目,以包含更复杂的元素,例如差异条或误差线。我们希望这篇文章能够帮助您更好地掌握Matplotlib的图例工具,并为您的数据可视化工作带来更好的可读性和可视性。
极客教程