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

Matplotlib技术求助:如何让每次绘图时各组点使用固定颜色?

解决Matplotlib绘制MNIST散点图时类别颜色不固定的问题

嘿,这个问题我之前调可视化的时候也踩过坑!你遇到的颜色每次变化的问题,是因为Matplotlib默认的颜色循环会在每次绘图时从头触发,但直接传c=x不生效的原因是——scatter的c参数如果是单个数值,它会把这个值映射到颜色条(colormap)上,而不是直接对应颜色循环里的第x个颜色。

下面给你两种靠谱的解决方法,都能让每个类别(0-9)的颜色固定下来:

方法1:复用Matplotlib默认颜色循环

直接获取Matplotlib内置的颜色循环列表,让每个类别对应列表里固定索引的颜色:

import matplotlib.pyplot as plt

# 获取默认的颜色循环列表,里面的颜色顺序是固定的
fixed_colors = plt.rcParams['axes.prop_cycle'].by_key()['color']

plt.figure(figsize=[13, 8])
for x in range(10):
    labels = pred_labels[:len(predict)]
    mask = labels == x
    # 用color参数指定固定颜色,x对应列表里的第x个颜色
    plt.scatter(tnse[:, 0][mask], tnse[:, 1][mask], label=x, color=fixed_colors[x])
plt.legend(fontsize='large')
plt.title('MNIST predictions')
plt.show()

方法2:自定义固定颜色列表

如果你想自己指定每个类别的颜色,比如用区分度更高的配色,可以手动定义一个包含10种颜色的列表:

import matplotlib.pyplot as plt

# 自定义10种固定颜色,顺序对应类别0-9
fixed_colors = [
    '#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7',
    '#DDA0DD', '#98D8C8', '#F7DC6F', '#BB8FCE', '#85C1E9'
]

plt.figure(figsize=[13, 8])
for x in range(10):
    labels = pred_labels[:len(predict)]
    mask = labels == x
    plt.scatter(tnse[:, 0][mask], tnse[:, 1][mask], label=x, color=fixed_colors[x])
plt.legend(fontsize='large')
plt.title('MNIST predictions')
plt.show()

为什么之前的c=x不生效?

简单说,scatter的c参数有两种核心用法:

  • 如果传入的是数组,它会把数组里的每个值映射到颜色条上,生成渐变效果;
  • 如果传入单个数值,它会把这个数值当作颜色映射的一个点,而不是直接使用颜色循环里的颜色。

而color参数是直接指定单个颜色,正好符合我们给每个类别固定颜色的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:57:44