为传奇结合两个Pyplot补丁

时间:2015-02-26 01:16:38

标签: python matplotlib data-visualization legend

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

我最初的想法是尝试组合两个补丁(Patch和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',))

Figure

3 个答案:

答案 0 :(得分:10)

解决方案借鉴了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',))

Figure

答案 1 :(得分:1)

从您的代码开始,

这是我能找到的最接近的人。可能有一种方法以你想要的方式创建补丁,但我对此也有点新意,我所能做的就是建立正确的传说:

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

enter image description here

据我所知,你必须创建适合你正在寻找的设计的ans“艺术家”对象,我无法找到一种方法。在这个帖子中可以找到类似的东西的一些例子: Custom Legend Thread

希望有助于好运,如果有更深入的方式,我感兴趣。

答案 2 :(得分:1)

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

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

然而,我的两个(金星和火星)标记在图例中重叠。我尝试使用handlelength,但这似乎没有帮助。任何建议或意见都会有所帮助。