【问题标题】:Matplotlib: Multiple legends on same figureMatplotlib:同一图形上的多个图例
【发布时间】:2014-10-06 00:26:59
【问题描述】:

我有几个绘图函数,每个函数都接收不同类型的数据并绘制它们,并带有自己的标题和图例。但是,当我尝试将它们绘制在同一个图形上时,前者会被覆盖。

我知道这样做的一种方法是调用get_artist(),但是由于图例是在函数内部创建的,这似乎是不可能的。有没有任何类型的LegendHandler 可以做到这一点?要从每个情节中检索图例并在图中显示它们?我应该从每个函数返回图例吗?

这是我所拥有的简化代码:

def plot_1(fig, data, ax = None):
    if ax = None:
        ax = fig.add_subplot(111)
    ax.plot(data)
    ax.set_xlabel('t')
    plt.axis('tight')

    # Create a legend
    colors = {'A':'blue',
              'B':'yellow',
              'C':'red'}
    legend_labels = []
    legend_handles = []

    for key in colors.keys():
        legend_labels.append(key)
        p = matplotlib.patches.Rectangle((0, 0), 1, 1, fc = colors[key], alpha = 0.5)
        legend_handles.append(p)
    ax.legend(legend_handles, legend_labels, loc='center left', bbox_to_anchor=(1, 0.5))

def plot_2(fig, data, ax = None):
    if ax = None:
        ax = fig.add_subplot(111)
    ax.plot(data, color='green', linewidth=1, label='L1')
    ax.set_xlabel('t')
    ax.autoscale()
    ax.legend()

def main():

    plot_1(fig, data = data1)
    plot_2(fig, data = data2)

我不确定这是否是最好的方法,但由于我多次使用这些绘图模型,我觉得我必须将它们保持在函数形式中。

评论注释:

  • matplotlib: 2 different legends on same graph 是我提到 get_artist 的原因,在那个线程中提到了。我现在实际上已经使用它解决了它,但我正在为这种特殊情况寻找一种更清洁的方法。我现在所做的是从每个函数返回一个 legend 并执行该线程中的建议。

【问题讨论】:

标签: python matplotlib plot legend


【解决方案1】:

让你的函数返回图例

def plot_2(fig, data, ax = None):
    ....
    return ax.legend()

那你就可以了

legend1 = plot_1(fig, data = data1)
plot_2(fig, data = data2)
pyplot.gca().add_artist(legend1)

这里建议:matplotlib: 2 different legends on same graph

【讨论】:

  • 谢谢。这实际上是我在上面的评论中提到的,但如果有的话,我正在寻找一种更“pythonic”的方式。
  • 如果你不使用pyplot接口,可能会有,但是看看matplotlib的面向对象的接口。
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多