用多行设置图例(在python中)

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33322349/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 13:11:53  来源:igfitidea点击:

set legend for plot with several lines (in python)

pythonmatplotlibplot

提问by Claudia

I have several lines plotted in the same figure and I want name this group of lines according to its content. Over those lines I intended yet to plot the average with the errorbar. But two main problem arise:

我在同一个图中绘制了几条线,我想根据其内容命名这组线。在这些线上,我还打算用误差条绘制平均值。但是出现了两个主要问题:

1) My legend does not appear as I intend (even trying to plot a extra point out of the range of the figure I can't give them a name - workaround)

1)我的图例没有按照我的意图出现(即使试图绘制超出图形范围的额外点,我也无法给它们命名 - 解决方法)

2) the plot with the average and errorbars is not superposed. Sometimes it is in front and sometimes it is behind the other curves.

2) 带有平均值和误差条的图没有叠加。有时它在前面,有时它在其他曲线后面。

What should I do to get it fixed? I could do it in Matlab (same problem for Matlab) But did not find the answer for pythonenter image description here.

我应该怎么做才能修复它?我可以在 Matlab 中完成(Matlab 的相同问题)但没有找到 python 的答案在此处输入图片说明

This is the part of the plot of my routine:

这是我的日常情节的一部分:

    UYavg = np.nanmean(UYbvall,0)
    yerr = np.nanstd(UYbvall,0)
    plt.figure()
    for i in range(71):
        plt.plot(LTbvall[i],UYbvall[i],'r-')
    l1 = plt.plot([-2,-1],[1,2],'r-')
    l2 = plt.plot(LTbvall[3],UYavg,'b*-')
    plt.errorbar(LTbvall[2],UYavg, yerr = yerr,ecolor='b')
    plt.xlabel('Tempo (LT)')
    plt.xlim(0,24)
    plt.ylabel('Uy (m/s)')
    plt.title('Vento neutro zonal calculado pelo modelo NWM (BV)')
    plt.legend((l1,l2),('Perfis COPEX','Media'), loc = 'best')

EDIT: the answer must be similar to Multiple lines in a plotor make-custom-legend-in-matplotlib

编辑:答案必须类似于Multiple lines in a plotmake-custom-legend-in-matplotlib

采纳答案by Claudia

Well based on another questions (make-custom-legend-in-matplotliband force-errorbars-to-render-last-with-matplotlib) I got it right. The second error should not happen, I think there may be a bug on zorder option. If I select only the larger number for the error bar, the plot of error bar continues hiden. So I had to set a negative number for the zorder for the lines in the for loop.

基于另一个问题(make-custom-legend-in-matplotlibforce-errorbars-to-render-last-with-matplotlib)我做对了。第二个错误不应该发生,我认为 zorder 选项可能存在错误。如果我只为误差线选择较大的数字,误差线图将继续隐藏。所以我不得不为 for 循环中的行的 zorder 设置一个负数。

The lines that fix the problems are:

解决问题的行是:

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
for i in range(71):
    ax.plot(LTbvall[i],UXbvall[i],'-',color ='#C0C0C0',label = 'Perfis COPEX',zorder = -32)
ax.plot(LTbvall[3],UXavg,'b*-', label = u'média')
ax.errorbar(LTbvall[3],UXavg, yerr = yerr,ecolor='b',zorder = 10)
#Get artists and labels for legend and chose which ones to display
handles, labels = ax.get_legend_handles_labels()
display = (0,71)
ax.set_xlabel('Tempo (LT)')
ax.set_xlim(0,24)
ax.set_ylabel('Ux (m/s)')
ax.set_title('Vento neutro meridional calculado pelo modelo NWM (BV)')
ax.legend([handle for i,handle in enumerate(handles) if i in display],
      [label for i,label in enumerate(labels) if i in display], loc = 'best')
fig.savefig(path[9] + 'Uxbvall_LT_nwm')
plt.clf() 
plt.gcf()
plt.close()

The output is as follows:

输出如下:

enter image description here

在此处输入图片说明

回答by BlivetWidget

I find the easiest solution is to give the lines labels at creation. Try the following, you will see both lines show up on the legend:

我发现最简单的解决方案是在创建时给线条标签。尝试以下操作,您将看到图例上显示了两行:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], color='red', label='line one')
plt.plot([4, 6, 8], color='blue', label='line two')
plt.legend()
plt.show()

回答by DilithiumMatrix

I'm surprised you're not getting an error message when you try to create your legend. The plt.plotcommand always returns a tuple, so you should be catching l1, = plt.plot(...). Does that fix it?

当您尝试创建您的图例时,您没有收到错误消息,我感到很惊讶。该plt.plot命令始终返回一个元组,因此您应该捕获l1, = plt.plot(...). 那能解决吗?