【问题标题】:Combine two Pyplot patches for legend结合两个 Pyplot 补丁作为图例
【发布时间】:2015-02-26 01:16:37
【问题描述】:

我正在尝试绘制一些带有置信带的数据。我正在为每个数据流绘制两个图:plotfill_between。我希望图例看起来与图相似,其中每个条目都有一个框(置信区域的颜色),其中有一条穿过中心的较暗实线。到目前为止,我已经能够使用补丁创建矩形图例键,但我不知道如何实现中心线。我尝试使用影线,但无法控制位置、厚度或颜色。

我最初的想法是尝试结合两个补丁(补丁和 2DLine);但是,它还没有奏效。有更好的方法吗?我的 MWE 和当前的数字如下所示。

import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,1,11)
y = np.linspace(0,1,11)

plt.plot(x, y, c='r')
plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5)
p = mpatches.Patch(color='r', alpha=0.5, linewidth=0)

plt.legend((p,), ('Entry',))

【问题讨论】:

    标签: python matplotlib data-visualization legend


    【解决方案1】:

    解决方案是从 CrazyArm 的评论中借用的,在这里可以找到:Matplotlib, legend with multiple different markers with one label。显然你可以制作一个句柄列表并只分配一个标签,它神奇地结合了两个句柄/艺术家。

    import matplotlib.patches as mpatches
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0,1,11)
    y = np.linspace(0,1,11)
    
    p1, = plt.plot(x, y, c='r')  # notice the comma!
    plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5)
    p2 = mpatches.Patch(color='r', alpha=0.5, linewidth=0)
    
    plt.legend(((p1,p2),), ('Entry',))
    

    【讨论】:

    • 对于任何偶然发现这一点的人:这只适用于句柄是元组而不是列表的情况。
    【解决方案2】:

    从您的代码开始,

    这是我能找到的最接近你的地方。可能有一种方法可以以您想要的方式创建补丁,但我对此也有点陌生,我所能做的就是建立正确的图例:

    import matplotlib.patches as mpatches
    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0,1,11)
    y = np.linspace(0,1,11)
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    plt.plot(x, y, c='r',label='Entry')
    plt.fill_between(x, y-0.2, y+0.2, color='r', alpha=0.5)
    p_handle = [mpatches.Patch(color='r', alpha=0.5, linewidth=0)]
    p_label = [u'Entry Confidence Interval']
    handle, label = ax.get_legend_handles_labels()
    handles=handle+p_handle
    labels=label+p_label
    plt.legend(handles,labels,bbox_to_anchor=(0. ,1.02 ,1.,0.3),loc=8,
               ncol=5,mode='expand',borderaxespad=0,prop={'size':9},numpoints=1)
    
    plt.show()
    

    据我所知,您必须创建适合您正在寻找的设计的“艺术家”对象,而我找不到这样做的方法。在这个线程中可以找到一些类似的例子: Custom Legend Thread

    希望对好运有所帮助,如果还有更深入的方法,我也很感兴趣。

    【讨论】:

    【解决方案3】:

    我遇到了“类似”的问题。由于这个问题,我能够实现以下目标。

    fig = pylab.figure()
    figlegend = pylab.figure(figsize=(3,2))
    ax = fig.add_subplot(111)
    point1 = ax.scatter(range(3), range(1,4), 250, marker=ur'$\u2640$', label = 'S', edgecolor = 'green')
    point2 = ax.scatter(range(3), range(2,5), 250, marker=ur'$\u2640$', label = 'I', edgecolor = 'red')
    point3 = ax.scatter(range(1,4), range(3),  250, marker=ur'$\u2642$', label = 'S', edgecolor = 'green')
    point4 = ax.scatter(range(2,5), range(3), 250, marker=ur'$\u2642$', label = 'I', edgecolor = 'red')
    figlegend.legend(((point1, point3), (point2, point4)), ('S','I'), 'center',  scatterpoints = 1, handlelength = 1)
    figlegend.show()
    pylab.show()
    

    但是,我的两个(金星和火星)标记在图例中重叠。我尝试使用句柄长度,但这似乎没有帮助。任何建议或 cmets 都会有所帮助。

    【讨论】:

    • 我想出了一个解决办法给你。请创建一个新问题并在此处发布链接作为评论。由于字符数的限制,我无法将我的完整示例发布为评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2017-05-06
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多