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

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=[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,这是的高级 API matplotlib,它使用参数按颜色分隔组hue

    • sns.scatterplot- 轴级功能。

    • sns.relplotwith kind='scatter'(默认)-图形级功能。

    • 参见图形级与轴级函数

  • legend='full':确保每个组都会在图例中获得一个条目,当hue类别为数字时,这一点很重要。

  • 如果使用Anaconda发行版,seaborn 将已安装在(base)环境中。否则,请使用pipinstall 来安装非 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')
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用