Python Matplotlib多色图例条目

Python Matplotlib多色图例条目,python,matplotlib,legend,Python,Matplotlib,Legend,我希望使matplotlib中的图例条目如下所示: 对于给定的图例项,它有多种颜色。下面显示的代码输出一个红色矩形。我想知道我需要做什么才能把一种颜色叠加到另一种颜色上?还是有更好的解决方案 import matplotlib.patches as mpatches import matplotlib.pyplot as plt red_patch = mpatches.Patch(color='red', label='Foo') plt.legend(handles=[red_patch

我希望使matplotlib中的图例条目如下所示:

对于给定的图例项,它有多种颜色。下面显示的代码输出一个红色矩形。我想知道我需要做什么才能把一种颜色叠加到另一种颜色上?还是有更好的解决方案

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

red_patch = mpatches.Patch(color='red', label='Foo')
plt.legend(handles=[red_patch])

plt.show()

可能不完全是你要找的,但是你可以(非常)手动地将补丁和文本放在绘图上。例如:

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

fig, ax = plt.subplots()

red_patch = mpatches.Patch(color='red', label='Foo')
plt.legend(handles=[red_patch])

r1 = mpatches.Rectangle((0.1, 0.1), 0.18, 0.1, fill=False)
r2 = mpatches.Rectangle((0.12, 0.12), 0.03, 0.06, fill=True, color='red')
r3 = mpatches.Rectangle((0.15, 0.12), 0.03, 0.06, fill=True, color='blue')
ax.add_patch(r1)
ax.add_patch(r2)
ax.add_patch(r3)
ax.annotate('Foo', (0.2, 0.13), fontsize='x-large')

plt.show()

我建议的解决方案是将两个不同的图例合并为一个条目图例,如下所述:

然后,策略是将第一个方形标记的
fillstyle
设置为
left
,而另一个设置为
right
(请参阅)。然后,每个标记可以使用两种不同的颜色,以生成所需的双色图例条目

下面的代码显示了如何做到这一点。请注意,
plt.legend
中的
numpoints=1
参数非常重要,以便每个条目只显示一个标记

import matplotlib.pyplot as plt

plt.close('all')

#---- Generate a Figure ----

fig = plt.figure(figsize=(4, 4))
ax = fig.add_axes([0.15, 0.15, 0.75, 0.75])
ax.axis([0, 1, 0, 1])

#---- Define First Legend Entry ----

m1, = ax.plot([], [], c='red' , marker='s', markersize=20,
              fillstyle='left', linestyle='none')

m2, = ax.plot([], [], c='blue' , marker='s', markersize=20,
              fillstyle='right', linestyle='none')

#---- Define Second Legend Entry ----

m3, = ax.plot([], [], c='cyan' , marker='s', markersize=20,
              fillstyle='left', linestyle='none')

m4, = ax.plot([], [], c='magenta' , marker='s', markersize=20,
              fillstyle='right', linestyle='none')

#---- Plot Legend ----

ax.legend(((m2, m1), (m3, m4)), ('Foo', 'Foo2'), numpoints=1, labelspacing=2,
          loc='center', fontsize=16)

plt.show(block=False)
其结果是:


免责声明:这仅适用于双色图例条目。如果需要两种以上的颜色,除了@jwinterm()

所描述的方法之外,我想不出任何其他方法来实现这一点,也许还有另一种方法可以处理两个以上的补丁。确保根据列数对句柄/标签进行排序:

from matplotlib.patches import Patch
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

pa1 = Patch(facecolor='red', edgecolor='black')
pa2 = Patch(facecolor='blue', edgecolor='black')
pa3 = Patch(facecolor='green', edgecolor='black')
#
pb1 = Patch(facecolor='pink', edgecolor='black')
pb2 = Patch(facecolor='orange', edgecolor='black')
pb3 = Patch(facecolor='purple', edgecolor='black')

ax.legend(handles=[pa1, pb1, pa2, pb2, pa3, pb3],
          labels=['', '', '', '', 'First', 'Second'],
          ncol=3, handletextpad=0.5, handlelength=1.0, columnspacing=-0.5,
          loc='center', fontsize=16)

plt.show()
其结果是:


事实上,通过实现一个定制 图例处理程序,如matplotlib文档中“实现自定义图例处理程序”下所述:

导入matplotlib.pyplot作为plt
从matplotlib.collections导入PatchCollection
#定义图例将使用的对象
类多色补丁(对象):
定义初始化(自身,颜色):
self.colors=颜色
#为MulticolorPatch对象定义处理程序
类MultiColor PatchHandler(对象):
def legend_艺术家(自身、legend、原始把手、fontsize、把手盒):
宽度,高度=车把箱.宽度,车把箱.高度
补丁=[]
对于枚举中的i,c(原始句柄颜色):
附加(plt.矩形([宽度/长度(原始句柄颜色)*i,0],
宽度/长度(原始手柄颜色),
高度,
facecolor=c,
edgecolor='none'))
补丁=补丁集合(补丁,匹配\原始=真)
车把盒。添加艺术家(补丁)
返回补丁
#----选择一些颜色
颜色1=['g','b','c','m','y']
颜色2=['k','r','k','r','k','r']
#----创建一个虚拟图(只是为了证明它是有效的)
f、 ax=plt.子批次()
ax.plot([1,2,3,4,5],[1,4.5,2,5.5,3],c='g',lw=0.5,ls='-',
label=“…仅一行”)
最大散射(范围(len(colors1)),范围(len(colors1)),c=colors1)
最大散射([range(len(colors2))],[.5]*len(colors2),c=colors2,s=50)
#----获取已附加到轴的图例条目
h、 l=ax.get\u图例\u句柄\u标签()
#-----附加多色图例补丁
h、 附加(多色贴片(颜色1))
l、 附加(“一个漂亮的多色传奇补丁”)
h、 附加(多色贴片(颜色2))
l、 附加(“和另一个”)
#----创造传奇
f、 图例(h、l、loc='左上',
handler_map={MulticolorPatch:MulticolorPatchHandler()},
bbox_至_锚=(.125,.875))

到目前为止,这是最容易应用的。