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
相关产品推荐
相关产品推荐

