matplotlib (python) - 在没有 pyplot 的情况下为多个绘图创建单个自定义图例

Posted

技术标签:

【中文标题】matplotlib (python) - 在没有 pyplot 的情况下为多个绘图创建单个自定义图例【英文标题】:matplotlib (python) - create single custom legend for multiple plots WITHOUT pyplot 【发布时间】:2016-10-15 01:22:51 【问题描述】:

我想在 pyqt GUI 中为 matplotlib (python) 中的多个绘图创建自定义图例。 (pyqt 建议不要使用 pyplot 所以必须使用面向对象的方法)。

多个图将显示在网格中,但用户可以定义要显示的图数。我希望图例出现在所有图的右侧,因此我不能简单地为最后绘制的轴创建图例。我希望为整个图形创建图例,而不仅仅是最后一个轴(类似于plt.figlegend in pyplot)。

在我看到elsewhere 的示例中,这需要引用绘制的线。同样,我不能这样做,因为用户可以选择在图表上显示哪些线条,我希望图例始终显示所有可能的线条,无论它们当前是否显示。

(注意下面的示例代码使用 pyplot 但我的最终版本不能)

import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import numpy as np

fig = plt.figure()

# Create plots in 2x2 grid
for plot in range(4):
    # Create plots
    x = np.arange(0, 10, 0.1)
    y = np.random.randn(len(x))
    y2 = np.random.randn(len(x))
    ax = fig.add_subplot(2,2,plot+1)
    plt.plot(x, y, label="y")
    plt.plot(x, y2, label="y2")

# Create custom legend
blue_line = mlines.Line2D([], [], color='blue',markersize=15, label='Blue line')
green_line = mlines.Line2D([], [], color='green', markersize=15, label='Green line')
ax.legend(handles=[blue_line,green_line],bbox_to_anchor=(1.05, 0),  loc='lower left', borderaxespad=0.)

如果我将 ax.legend 更改为: fig.legend(handles=[blue_line,green_line]) 然后python产生错误:

TypeError: legend() 至少需要 3 个参数(给定 2 个)

(我猜是因为没有引用线点)

感谢您提供的任何帮助 - 我已经看了一个星期了!

【问题讨论】:

【参考方案1】:

您遇到的错误是因为Figure.legend 要求您同时传递handleslabels

来自文档:

图例(句柄、标签、*args、**kwargs)

在图中放置一个图例。 labels 是字符串序列,handlesLine2DPatch 实例的序列。

以下作品:

# Create custom legend
blue_line = mlines.Line2D([], [], color='blue',markersize=15, label='Blue line')
green_line = mlines.Line2D([], [], color='green', markersize=15, label='Green line')

handles = [blue_line,green_line]
labels = [h.get_label() for h in handles] 

fig.legend(handles=handles, labels=labels)  

【讨论】:

那是伟大的汤姆 - 非常感谢您花时间回答!我认为通过调用图例正在“读取”手柄内的标签。现在看起来很明显,你已经向我展示了!

以上是关于matplotlib (python) - 在没有 pyplot 的情况下为多个绘图创建单个自定义图例的主要内容,如果未能解决你的问题,请参考以下文章

Python - matplotlib - 加权图

matplotlib - Blender python中没有名为tkinter的模块

当我使用 matplotlib.pyplot 时,python 3.6 中没有名为 PyQt4 的模块

python3 使用matplotlib画图出现中文乱码的情况

Python 教程Matplotlib 数据类型汇总

python Matplotlibで没有显示名称,没有$ DISPLAY环境变量が発生する