带有图例的matplotlib散点图

use*_*768 5 python plot matplotlib

我有兴趣在我的散点图中绘制一个图例.我目前的代码看起来像这样

x=[1,2,3,4]
y=[5,6,7,8]
classes = [2,4,4,2]
plt.scatter(x, y, c=classes, label=classes)
plt.legend()
Run Code Online (Sandbox Code Playgroud)

问题是创建绘图时,图例显示为数组,而不是显示唯一标签及其类.

这是情节的样子

我知道这是在线程像这样前面所讨论的一个问题一个,但我觉得我的问题是,即使简单的解决方案存在不适合它.此外,在那个例子中,这个人正在指定颜色,但在我的情况下,我事先知道我需要多少颜色.此外,在示例中,用户正在创建多个散布,每个散射具有唯一的颜色.再说一遍,这不是我想要的.我的目标是使用x,y数组和标签简单地创建绘图.这可能吗?

谢谢.

Imp*_*est 9

实际上,这两个相关问题都提供了一种如何实现预期结果的方法.

最简单的方法是创建与唯一类一样多的散点图,并为每个散点图提供单个颜色和图例条目.

import matplotlib.pyplot as plt

x=[1,2,3,4]
y=[5,6,7,8]
classes = [2,4,4,2]
unique = list(set(classes))
colors = [plt.cm.jet(float(i)/max(unique)) for i in unique]
for i, u in enumerate(unique):
    xi = [x[j] for j  in range(len(x)) if classes[j] == u]
    yi = [y[j] for j  in range(len(x)) if classes[j] == u]
    plt.scatter(xi, yi, c=colors[i], label=str(u))
plt.legend()

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果类是字符串标签,解决方案看起来会略有不同,因为您需要从索引中获取颜色而不是使用类本身.

import numpy as np
import matplotlib.pyplot as plt

x=[1,2,3,4]
y=[5,6,7,8]
classes = ['X','Y','Z','X']
unique = np.unique(classes)
colors = [plt.cm.jet(i/float(len(unique)-1)) for i in range(len(unique))]
for i, u in enumerate(unique):
    xi = [x[j] for j  in range(len(x)) if classes[j] == u]
    yi = [y[j] for j  in range(len(x)) if classes[j] == u]
    plt.scatter(xi, yi, c=colors[i], label=str(u))
plt.legend()

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我是唯一一个发现令人惊讶的人,没有建立方法吗?我觉得绘制不同类别​​的点的分布是一项非常平常的任务.如果你知道为什么,请告诉我. (11认同)
  • 为散点图构建图例,该图例仅显示哪个颜色对应于哪个标签.我发现令人惊讶的是我必须遍历标签.(imo)非常频繁的用例是在机器学习中:你对功能进行了花哨的降维,并希望在2D中绘制它们.你得到的是很多属于一组有限类的点( - >你的标签/颜色).例如,谷歌搜索"t-SNE plot". (5认同)

Pab*_*yes 5

也许手动填充table可能在这里有用。colorbar如果您的类是连续数字,则使用另一个想法。我将两种方法合而为一。

import matplotlib.pyplot as plt
import numpy as np

x=[1,2,3,4,5,6,7]
y=[1,2,3,4,5,6,7]
classes = [2,4,4,2,1,3,5]
cmap = plt.cm.get_cmap("viridis",5)
plt.scatter(x, y, c=classes, label=classes,cmap=cmap,vmin=0.5,vmax=5.5)
plt.colorbar()
unique_classes = list(set(classes))
plt.table(cellText=[[x] for x in unique_classes], loc='lower right',
          colWidths=[0.2],rowColours=cmap(np.array(unique_classes)-1),
         rowLabels=['label%d'%x for x in unique_classes],
          colLabels=['classes'])
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明