如何将图例添加到散点图

时间:2018-11-28 18:02:26

标签: python matplotlib seaborn

我正在为机器学习课程做练习。 我将矩阵形式的图像数据集附加到矩阵中,然后添加到数据矩阵中,然后对其进行标准化,然后计算出主要成分。 Labels是一个数组,其中包含每个图像的标签(包含标签的子目录) 我需要可视化成对的主成分,在这一部分的前两个。这位教授的建议是使用matplotli.scatter函数,我发现seaborn.scatterplot函数看起来更好,但是在没有两个函数的情况下,我都设法在图例上添加了标签名称。

pca = PCA()
X_t = pca.fit_transform(datamatrix)
X_r = pca.inverse_transform(X_t)

plt.figure(figsize=(25,5))

colours = ['r','g','b','p']
plt.subplot(1, 3, 1)
sns.scatterplot(X_t[:,0], X_t[:,1], hue=labels, palette=colours, legend='full')
plt.title('PC 1 and 2')

我是Python和机器学习库的新手

编辑: 如建议的那样,我尝试修改了鳕鱼:

data = {"x" : X_t[:,0], "y" : X_t[:,1], "label" : labels}
sns.scatterplot(x="x", y="y", hue="label", palette=colours, data=data, legend='full')

但是我得到了相同的结果:我有图例,但没有标签名称 capture

2 个答案:

答案 0 :(得分:0)

在显示图之前,请使用以下符号添加图例:

plt.legend()

答案 1 :(得分:0)

Seaborn scatterplot将自动创建一个图例,如来自the documentation的第二个示例所示。但是,它确实需要使数据具有类似于字典的结构,这在熊猫数据帧中很常见。

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

data = {"x" : np.random.rand(10),
        "y" : np.random.rand(10),
        "label" : np.random.choice(["Label 1", "Label 2"], size=10)}

sns.scatterplot(x="x", y="y", hue="label", data=data)
plt.show()

enter image description here

要通过matplotlib的scatter实现相同的功能,您需要自己创建图例,这确实有点麻烦,但可能有助于理解。

import numpy as np
import matplotlib.pyplot as plt

data = {"x" : np.random.rand(10),
        "y" : np.random.rand(10),
        "label" : np.random.choice(["Label 1", "Label 2"], size=10)}

labels, inv = np.unique(data["label"], return_inverse=True)
scatter = plt.scatter(x="x", y="y", c = inv, data=data)

handles = [plt.Line2D([],[],marker="o", ls="", 
                      color=scatter.cmap(scatter.norm(yi))) for yi in np.unique(inv)]
plt.legend(handles, labels)

plt.show()

enter image description here

另请参见Add legend to scatter plot (PCA)