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

