如何绘制带有每个类别的图例标签的散点图
- 2025-04-15 09:19:00
- admin 原创
- 28
问题描述:
我想在散点图中绘制图例。我目前的代码如下
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()
问题在于,当创建图表时,图例显示为数组,而不是显示唯一的标签及其类别。
我知道这个问题之前在类似的主题中讨论过,但是我觉得我的问题更简单,那里的解决方案并不适用。另外,那个例子中,用户指定了颜色,而我的情况是,我事先知道需要多少种颜色。此外,在这个例子中,用户创建了多个散点图,每个散点图都有唯一的颜色。这也不是我想要的。我的目标是简单地使用数组和标签来创建图表x, y
。可以吗?
解决方案 1:
实际上,这两个相关的问题都提供了一种实现预期结果的方法。
最简单的方法是创建与唯一类一样多的散点图,并为每个散点图赋予单一颜色和图例条目。
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()
如果类是字符串标签,解决方案会略有不同,因为您需要从它们的索引中获取颜色,而不是使用类本身。
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()
解决方案 2:
也许手动填充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'])
解决方案 3:
最简单的解决方案是使用
seaborn
,这是的高级 APImatplotlib
,它使用参数按颜色分隔组hue
。sns.scatterplot
- 轴级功能。sns.relplot
withkind='scatter'
(默认)-图形级功能。参见图形级与轴级函数
legend='full'
:确保每个组都会在图例中获得一个条目,当hue
类别为数字时,这一点很重要。如果使用Anaconda发行版,seaborn 将已安装在
(base)
环境中。否则,请使用pip
install 来安装非 Anaconda 环境。
import seaborn as sns
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6.5, 3.5))
sns.scatterplot(x=x, y=y, hue=classes, legend='full', ax=ax)
g = sns.relplot(kind='scatter', x=x, y=y, hue=classes, legend='full', height=3.5, aspect=1.5)
pandas.DataFrame
或者,从数据列表中创建一个,然后使用 seaborn 进行绘图。
import pandas as pd
# create the dataframe
df = pd.DataFrame({'x': x, 'y': y, 'classes': classes})
# axes level plot
ax = sns.scatterplot(data=df, x='x', y='y', hue='classes', legend='full')
# figure level plot
g = sns.relplot(kind='scatter', data=df, x='x', y='y', hue='classes', legend='full')
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD