颜色和标记的传说

时间:2017-12-15 12:15:56

标签: python numpy matplotlib legend scatter

我想在散点图中绘制两个矩阵的值。对于散点图的每个点,我想看看它们在哪一列和哪一行。对于不同的行,我使用不同的颜色。对于不同的列,我使用不同的标记。在图例中,我希望颜色指示数字(对应于行)和标记以指示字母(对应于列)。我设法获得了图例中的列,但不是行。简化我的代码看起来像这样:

x = np.array([[np.nan, 5, 6], [3, 4, 8], [0, 0, 9]])
y = np.array([[np.nan, 4, 7], [7, 8, 2], [1, 2, 7]])
color = np.array([['b','g','r'],]*3).transpose()  # Can be other colours than b,g,r
marker = ['o', 'v', '^']
label = ['A','B','C']
for j in range(3):
    plt.scatter(x[:,j], y[:,j], c=color[:,j], marker=marker[j], label=label[j])
plt.xlabel("xlabel")
plt.ylabel("ylabel")
plt.legend(loc=2)
plt.show()
plt.ylabel("ylabel")
plt.legend(loc=2)

我怎样才能添加标记?现在在我的传说中,第一个标记是绿色,而另外两个是蓝色。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

制作图例的想法是创建代理艺术家(即仅用于图例):plt.legend(list_of_proxy_artists, list_of_labels)

可以通过绘制空行来获得列标记:

proxy = plt.plot([], [], 'o', markerfacecolor='w', markeredgecolor='k')[0]

可以使用补丁创建行的彩色矩形:

patch = mpatches.Patch(color='r')

把所有东西放在一起:

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

x = np.array([[np.nan, 5, 6], [3, 4, 8], [0, 0, 9]])
y = np.array([[np.nan, 4, 7], [7, 8, 2], [1, 2, 7]])
color = np.array([['b','g','r'],]*3).transpose()  # Can be other colours than b,g,r
marker = ['o', 'v', '^']

for j in range(3):
    plt.scatter(x[:,j], y[:,j], c=color[:,j], marker=marker[j])
plt.xlabel("xlabel")
plt.ylabel("ylabel")

# legend
label_column = ['A','B','C']
label_row = ['1', '2', '3']
rows = [mpatches.Patch(color=color[i, 0]) for i in range(3)]
columns = [plt.plot([], [], marker[i], markerfacecolor='w',
                    markeredgecolor='k')[0] for i in range(3)]

plt.legend(rows + columns, label_row + label_column, loc=2)

plt.show()

enter image description here