python 如何为每个类绘制带有图例标签的散点图

2j4z5cfb  于 2023-04-28  发布在  Python
关注(0)|答案(3)|浏览(155)

我对在散点图中绘制图例很感兴趣。我当前的代码如下所示

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()

问题在于,在创建图时,图例显示为数组,而不是显示唯一的标签及其类。

我知道这是之前在one等线程中讨论过的问题,但是,我觉得我的问题更简单,那里的解决方案不适合。另外,在那个例子中,这个人指定了颜色,但是,在我的例子中,我事先知道我需要多少颜色。此外,在this示例中,用户正在创建多个散射,每个散射具有唯一的颜色。再说一次,这不是我想要的。我的目标是使用x, y数组和标签简单地创建图。这可能吗?

bvhaajcl

bvhaajcl1#

实际上,这两个相关的问题都提供了一种如何达到预期结果的方法。
最简单的方法是创建尽可能多的散点图,只要存在唯一的类,并为每个类提供一种颜色和图例条目。

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()

b5buobof

b5buobof2#

也许手动填充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'])

v2g6jxz6

v2g6jxz63#

  • 最简单的解决方案是使用seabornmatplotlib的高级API,它使用hue参数按颜色分隔组。
  • sns.scatterplot-轴级函数。
  • sns.relplotkind='scatter'(默认)-图形级功能。
  • 请参见图形级别与轴级函数
  • legend='full':确保每个组都将在图例中获得一个条目,这在hue类别为数字时很重要。
  • 如果使用Anaconda发行版,seaborn将已经安装在(base)环境中。否则使用pip安装非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', data=df, x=x, y=y, hue=classes, legend='full', height=3.5, aspect=1.5)

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')

相关问题