Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为图例合并两个Pyplot修补程序_Python_Matplotlib_Data Visualization_Legend - Fatal编程技术网

Python 为图例合并两个Pyplot修补程序

Python 为图例合并两个Pyplot修补程序,python,matplotlib,data-visualization,legend,Python,Matplotlib,Data Visualization,Legend,我正试图用置信带绘制一些数据。我为每个数据流绘制了两个图:plot,以及fill\u-between。我希望图例看起来与绘图相似,每个条目都有一个方框(置信区域的颜色),中间有一条较暗的实线。到目前为止,我已经能够使用补丁创建矩形图例关键点,但我不知道如何实现中心线。我尝试使用hatch,但无法控制位置、厚度或颜色 我最初的想法是尝试合并两个补丁(Patch和2DLine);然而,它还没有起作用。有更好的方法吗?我的MWE和当前数据如下所示 import matplotlib.patches a

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

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

从代码开始

这是我能找到的最接近你的了。可能有一种方法可以按照您想要的方式创建修补程序,但我对此也有点陌生,我所能做的就是创建适当的图例:

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

从我能告诉你的,你必须创造一个“艺术家”的对象,适合你正在寻找的设计,我找不到一个方法做。此线程中可以找到一些类似的示例:


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

该解决方案借鉴了CrazyArm的评论,在这里找到:。显然,您可以创建一个句柄列表,并只指定一个标签,它将两个句柄/艺术家神奇地结合在一起

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

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

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,但似乎没用。任何建议或评论都会很有帮助。

谢谢你的提示!实际上,我可以通过以下链接使其正常工作:。查看我的答案以获得详细的示例。我为您提供了一个解决方案。请创建一个新问题,并将链接作为评论发布在此处。由于字符数的限制,我无法将我的完整示例作为注释发布。。谢谢@Blink.对于任何无意中发现这一点的人:只有当句柄是元组而不是列表时,这才有效。