Matplotlib 添加项目横向而非纵向

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()

我们可以看到,该图例包含图形本身,以及一个自定义的文本标签。我们使用Line2DPatch类暂时创建并重用了的对象。

总结

在本文中,我们研究了如何在Matplotlib中将图例横向排列以释放垂直空间。我们还介绍了如何使用legend_handler自定义图例条目,以包含更复杂的元素,例如差异条或误差线。我们希望这篇文章能够帮助您更好地掌握Matplotlib的图例工具,并为您的数据可视化工作带来更好的可读性和可视性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程