Python Matplotlib:使用子地块线标签的所有子地块的自动彩色图例

Python Matplotlib:使用子地块线标签的所有子地块的自动彩色图例,python,matplotlib,Python,Matplotlib,下面的代码实现了我想要做的事情,但它是以一种非常迂回的方式实现的。我四处寻找了一种简洁的方法来为一个图形生成一个图例,该图例包含多个子图,并考虑了它们的标签,但毫无用处。需要传入标签和线,并且只需要句柄(稍微好一点) 下面的例子说明了我想要什么。我有9个向量,每个向量有3个类别中的一个。我想在一个单独的子图上绘制每个向量,给它贴上标签,并绘制一个图例,该图例指示(使用颜色)标签的含义;这是单个绘图上的自动行为 你知道一个更好的方法来实现下面的情节吗 import numpy as np impo

下面的代码实现了我想要做的事情,但它是以一种非常迂回的方式实现的。我四处寻找了一种简洁的方法来为一个图形生成一个图例,该图例包含多个子图,并考虑了它们的标签,但毫无用处。需要传入标签和线,并且只需要句柄(稍微好一点)

下面的例子说明了我想要什么。我有9个向量,每个向量有3个类别中的一个。我想在一个单独的子图上绘制每个向量,给它贴上标签,并绘制一个图例,该图例指示(使用颜色)标签的含义;这是单个绘图上的自动行为

你知道一个更好的方法来实现下面的情节吗

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

nr_lines = 9
nr_cats = 3
np.random.seed(1337)

# Data
X = np.random.randn(nr_lines, 100)
labels = ['Category {}'.format(ii) for ii in range(nr_cats)]
y = np.random.choice(labels, nr_lines)

# Ideally wouldn't have to manually pick colours
clrs = matplotlib.rcParams['axes.prop_cycle'].by_key()['color']
clrs = [clrs[ii] for ii in range(nr_cats)]
lab_clr = {k: v for k, v in zip(labels, clrs)}

fig, ax = plt.subplots(3, 3)
ax = ax.flatten()
for ii in range(nr_lines):
    ax[ii].plot(X[ii,:], label=y[ii], color=lab_clr[y[ii]])

lines = [a.lines[0] for a in ax]
l_labels = [l.get_label() for l in lines]

# the hack - get a single occurance of each label
idx_list = [l_labels.index(lab) for lab in labels]
lines_ = [lines[idx] for idx in idx_list]
#l_labels_ = [l_labels[idx] for idx in idx_list]
plt.legend(handles=lines_, bbox_to_anchor=[2, 2.5])
plt.tight_layout()
plt.savefig('/home/james/Downloads/stack_figlegend_example.png',
            bbox_inches='tight')

您可以使用字典将标签作为键来收集它们。例如:

handles = {}

for ii in range(nr_lines):
    l1, = ax[ii].plot(X[ii,:], label=y[ii], color=lab_clr[y[ii]])

    if y[ii] not in handles:
        handles[y[ii]] = l1

plt.legend(handles=handles.values(), bbox_to_anchor=[2, 2.5])

仅当类别尚未存在时,才向字典添加句柄

您可以使用字典将标签作为键来收集它们。例如:

handles = {}

for ii in range(nr_lines):
    l1, = ax[ii].plot(X[ii,:], label=y[ii], color=lab_clr[y[ii]])

    if y[ii] not in handles:
        handles[y[ii]] = l1

plt.legend(handles=handles.values(), bbox_to_anchor=[2, 2.5])

仅当类别尚未存在时,才向字典添加句柄

干杯。不知道某个字典中的
k
与某个字典中的
k.keys()
是等价的(即,如果y[ii]不在句柄中起作用)!干杯不知道某个字典中的
k
与某个字典中的
k.keys()
是等价的(即,如果y[ii]不在句柄中起作用)!