Matplotlib无法循环遍历十六进制颜色列表问题求助
解决Matplotlib自定义颜色未生效的误解问题
我仔细看了你的代码和问题描述,发现了两个关键点:
核心误解:你的自定义颜色列表就是Matplotlib默认颜色
你定义的COLORS数组其实和Matplotlib默认的tab10颜色循环完全一致!所以即使你的循环逻辑是正确的,绘制出来的颜色和默认样式没有区别,这才让你误以为自定义颜色没生效。
你可以立刻测试验证:把COLORS里的某几个值改成完全不同的颜色,比如:
COLORS=['#ff0000' , '#00ff00' , '#0000ff' , '#d62728' , '#9467bd' , '#8c564b' , '#e377c2' , '#7f7f7f' , '#bcbd22' , '#17becf']
再运行代码,就能看到折线变成你自定义的红、绿、蓝配色了。
循环逻辑的优化建议
虽然你的循环逻辑本身没有错误,但可以写得更直观、更健壮:
- 避免用索引
i来取颜色,直接把要绘制的列和对应的颜色切片配对 - 变量名不要和
plot函数的color参数同名,避免混淆 - 去掉
from pylab import *,这种导入方式会污染全局命名空间,Matplotlib官方更推荐使用import matplotlib.pyplot as plt的标准写法
修正后的代码如下:
import pandas as pd import matplotlib.pyplot as plt import numpy as np import os, sys # 修改后的自定义颜色(替换了前三个颜色,方便测试) COLORS=['#ff0000' , '#00ff00' , '#0000ff' , '#d62728' , '#9467bd' , '#8c564b' , '#e377c2' , '#7f7f7f' , '#bcbd22' , '#17becf'] fig = plt.figure(figsize=(6.29921,4), dpi=150) ax = fig.add_subplot(111) # 生成测试数据 df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD')) Column_names = list(df.columns) print(Column_names) # 直接配对列和对应的颜色,无需手动维护索引 for col, custom_color in zip(Column_names[1:], COLORS[1:len(Column_names)]): print(custom_color) ax.plot(df["A"], df[col], linewidth=0.8, label=col, marker='o', markersize=2.5, color=custom_color) ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), borderaxespad=0, frameon=False) plt.show()
更灵活的颜色循环方案
如果后续你的列数可能超过COLORS的长度,可以用itertools.cycle来实现颜色自动循环:
from itertools import cycle # 创建颜色循环迭代器 color_cycle = cycle(COLORS) for col in Column_names[1:]: # 每次取循环中的下一个颜色 current_color = next(color_cycle) ax.plot(df["A"], df[col], linewidth=0.8, label=col, marker='o', markersize=2.5, color=current_color)
这样不管你有多少列,都会循环使用你的自定义颜色列表,不用担心索引越界的问题。
内容的提问来源于stack exchange,提问作者NorrinRadd
相关产品推荐
相关产品推荐

