You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多组散点图绘制技术求助:实现同画布多组散点、差异化标记及组内变量自定义颜色

解决Python散点图组内点颜色差异化的问题

嘿,我帮你搞定这个散点图的颜色问题!先指出你代码里的两个关键问题:

  1. 参数顺序错误:你把sample_data.Image2作为x轴传入,但你的x轴标签是"Physical Luminance",显然应该对应PL系列变量(ORI_PL、ORILOWER_PL、ORIHIGH_PL),y轴对应ML系列变量(ORI_ML等),这个得先修正。
  2. 颜色参数用法不对:你给c传了单一颜色值(比如'gray'、'b'),所以整组散点都是同一种颜色,自然没法实现组内每个点的颜色差异化。

下面是满足你需求的完整解决方案:

第一步:定义指定的调色板

先把你要求的调色板定义好,matplotlib支持大写的颜色名称,直接用就行:

import matplotlib.pyplot as plt

# 你指定的调色板
palette = ['BLUE', 'YELLOW', 'GREEN', 'RED', 'ORANGE']

第二步:实现组内点的颜色差异化

分两种常见场景来处理,你可以根据自己的实际情况选择:

场景1:根据分类变量分配颜色(推荐)

如果你的数据里有一个分类列(比如每个点属于某个类别,正好对应调色板里的颜色),直接用这个列映射颜色就行:

# 假设你的数据有个category列,取值对应调色板的索引或者颜色名称
# 先创建颜色映射字典
color_map = {i: palette[i] for i in range(len(palette))}
# 如果category是字符串(比如'BLUE'、'YELLOW'),直接用:
# color_map = {color: color for color in palette}

# 第一组:ORI_PL vs ORI_ML,标记用"o"
plt.scatter(sample_data.ORI_PL, sample_data.ORI_ML, 
            marker="o", 
            c=sample_data.category.map(color_map))

# 第二组:ORILOWER_PL vs ORILOWER_ML,标记用"+"
plt.scatter(sample_data.ORILOWER_PL, sample_data.ORILOWER_ML, 
            marker="+", 
            c=sample_data.category.map(color_map))

# 第三组:ORIHIGH_PL vs ORIHIGH_ML,标记用"_"
plt.scatter(sample_data.ORIHIGH_PL, sample_data.ORIHIGH_ML, 
            marker="_", 
            c=sample_data.category.map(color_map))

场景2:循环使用调色板颜色(无分类变量)

如果没有分类变量,只是想让组内每个点颜色不同,循环用你指定的调色板颜色,可以用itertools.cycle来生成循环的颜色序列:

from itertools import cycle

# 创建调色板的循环迭代器
color_cycler = cycle(palette)

# 第一组:生成和数据长度匹配的颜色列表
colors_ori = [next(color_cycler) for _ in range(len(sample_data.ORI_PL))]
plt.scatter(sample_data.ORI_PL, sample_data.ORI_ML, 
            marker="o", 
            c=colors_ori)

# 重置迭代器,让第二组从调色板开头开始循环(可选)
color_cycler = cycle(palette)
colors_lower = [next(color_cycler) for _ in range(len(sample_data.ORILOWER_PL))]
plt.scatter(sample_data.ORILOWER_PL, sample_data.ORILOWER_ML, 
            marker="+", 
            c=colors_lower)

# 重置迭代器
color_cycler = cycle(palette)
colors_high = [next(color_cycler) for _ in range(len(sample_data.ORIHIGH_PL))]
plt.scatter(sample_data.ORIHIGH_PL, sample_data.ORIHIGH_ML, 
            marker="_", 
            c=colors_high)

第三步:添加标签和展示图形

最后加上你的标签,还可以加个图例方便区分三组散点:

plt.xlabel("Physical Luminance")
plt.ylabel("Matched Luminance")
plt.legend(['ORI', 'ORILOWER', 'ORIHIGH'])
plt.show()

小提示

  • 如果每组数据点数量相同,也可以直接用palette * (len(data)//len(palette) + 1)生成足够的颜色序列,不用itertools.cycle。
  • matplotlib对颜色名称的大小写不敏感,所以'BLUE'和'blue'效果一样。

内容的提问来源于stack exchange,提问作者Malu soma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 04:28:16