用几行设置情节的图例(在python中)

时间:2015-10-24 19:23:11

标签: python matplotlib plot

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

1)我的传奇并没有像我想的那样出现(甚至试图在图的范围内绘制一个额外的点,我不能给它们起一个名字 - 解决方法)

2)带有平均值和错误栏的图不重叠。有时它在前面,有时它在其他曲线后面。

我该怎么办才能修好它?我可以在Matlab中做到这一点(same problem for Matlab)但是没有找到python enter image description here的答案。

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

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

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

相似

3 个答案:

答案 0 :(得分:5)

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

解决问题的方法是:

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

输出如下:

enter image description here

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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