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

如何为Matplotlib多折线图设置差异化明显的配色方案?

问题场景

用户原代码:

import matplotlib.pyplot as plt 
fig, ax = plt.subplots(figsize=(12,8)) 
for key in dct.keys(): 
    plt.plot(*zip(*dct.get(key)), label=key) 
ax.set_xticks(range(0,24)) 
ax.grid(color='gray', linestyle='-', linewidth=0.5) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('title') 
plt.legend(loc=0,fontsize='small') 
fig.show() 

问题描述:
通过for循环生成Matplotlib折线图,共包含20条折线(对应字典中的每个列表元素)。当前问题是这20条折线的配色相似度极高,绘制10条折线后配色方案开始重复,后续10条折线与前面的颜色一致,希望调整配色让各折线颜色差异足够明显。


解决方案

这个问题我之前也碰到过,Matplotlib默认的颜色循环确实只有10种左右区分度较高的颜色,超过这个数量就会重复使用。下面给你几个实用的调整方式:

1. 利用内置Colormap生成适配数量的颜色

Matplotlib有专门为多类别可视化设计的Colormap,比如tab20刚好包含20种差异明显的颜色,完全匹配你的需求。你可以直接从Colormap中提取对应数量的颜色,在循环中指定:

import matplotlib.pyplot as plt
from matplotlib import cm

fig, ax = plt.subplots(figsize=(12,8))
# 根据折线数量从tab20中提取对应颜色
num_lines = len(dct.keys())
color_map = cm.get_cmap('tab20', num_lines)

for idx, key in enumerate(dct.keys()):
    plt.plot(*zip(*dct.get(key)), label=key, color=color_map(idx))

ax.set_xticks(range(0,24)) 
ax.grid(color='gray', linestyle='-', linewidth=0.5) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('title') 
plt.legend(loc=0,fontsize='small') 
fig.show()

如果觉得tab20的颜色风格太鲜明,也可以选择viridis、plasma这类渐变Colormap,通过采样生成柔和但区分度足够的颜色。

2. 设置全局自定义颜色循环

如果你希望后续所有绘图都自动使用更多颜色,可以修改Matplotlib的全局配置,替换默认的颜色循环,这样原代码不用做太多改动:

import matplotlib.pyplot as plt
from cycler import cycler

# 用tab20的颜色替换默认循环,也可以换成自己收集的颜色列表
custom_cycler = cycler(color=plt.cm.tab20.colors)
plt.rc('axes', prop_cycle=custom_cycler)

# 原代码保持不变即可自动使用新颜色循环
fig, ax = plt.subplots(figsize=(12,8)) 
for key in dct.keys(): 
    plt.plot(*zip(*dct.get(key)), label=key) 

ax.set_xticks(range(0,24)) 
ax.grid(color='gray', linestyle='-', linewidth=0.5) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('title') 
plt.legend(loc=0,fontsize='small') 
fig.show()

3. 手动指定自定义颜色列表

如果你有自己偏好的颜色组合,可以直接定义一个包含20种颜色的列表,循环时按索引取色:

import matplotlib.pyplot as plt

# 示例:20种差异明显的十六进制颜色,你可以根据喜好替换
custom_colors = [
    '#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF',
    '#00FFFF', '#FFA500', '#800080', '#008000', '#800000',
    '#000080', '#808000', '#C0C0C0', '#008080', '#FFC0CB',
    '#A52A2A', '#DEB887', '#5F9EA0', '#7FFF00', '#D2691E'
]

fig, ax = plt.subplots(figsize=(12,8)) 
for idx, key in enumerate(dct.keys()): 
    plt.plot(*zip(*dct.get(key)), label=key, color=custom_colors[idx]) 

ax.set_xticks(range(0,24)) 
ax.grid(color='gray', linestyle='-', linewidth=0.5) 
plt.xlabel('x') 
plt.ylabel('y') 
plt.title('title') 
plt.legend(loc=0,fontsize='small') 
fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:46:47