如何在Matplotlib单图中为不同曲线设置正确颜色
解决Matplotlib多曲线颜色中途切换的问题
常见问题原因及对应解决方案
1. 未显式指定固定颜色,Matplotlib自动循环配色
如果绘制时没有给每条曲线指定color参数,Matplotlib会默认使用自带的颜色循环表,当曲线被拆分成多个分段(比如数据有中断)或多次调用plot时,会自动取下一个颜色,导致中途变色。
解决办法:给每条曲线显式指定固定颜色
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) y1 = np.sin(x) y2 = np.cos(x) # 直接用颜色名称、十六进制码或RGB值指定 plt.plot(x, y1, color='crimson', label='正弦曲线') plt.plot(x, y2, color='#4CAF50', label='余弦曲线') plt.legend() plt.show()
2. 数据存在非连续点(如NaN)导致曲线分段
如果你的数据中包含NaN值,Matplotlib会将这些位置视为曲线中断,每个连续的数据段会自动分配新的颜色,看起来像是同一条曲线中途变色。
解决办法:清理或填充非连续数据
- 方法一:移除
NaN对应的坐标点
# 模拟含NaN的数据集 y1_with_nan = y1.copy() y1_with_nan[20:30] = np.nan # 过滤掉NaN值 valid_mask = ~np.isnan(y1_with_nan) plt.plot(x[valid_mask], y1_with_nan[valid_mask], color='crimson', label='清理后曲线')
- 方法二:插值填充
NaN值(适合需要保留完整曲线的场景)
from scipy.interpolate import interp1d # 获取有效数据点 x_valid = x[valid_mask] y_valid = y1_with_nan[valid_mask] # 线性插值填充 interp_func = interp1d(x_valid, y_valid, kind='linear') y_filled = interp_func(x) plt.plot(x, y_filled, color='crimson', label='填充后曲线')
3. 循环绘制时重复调用plot却未绑定固定颜色
如果用循环批量绘制曲线,但没有给每条曲线分配固定颜色,或者循环逻辑错误导致同一条曲线被多次绘制,也会出现颜色切换问题。
解决办法:提前定义颜色列表,循环时按索引取用
# 预定义颜色列表 color_list = ['crimson', '#4CAF50', '#2196F3', '#FFC107'] curve_data = [np.sin(x), np.cos(x), np.sin(x)*2, np.cos(x)*2] for idx, y_data in enumerate(curve_data): plt.plot(x, y_data, color=color_list[idx], label=f'曲线 {idx+1}') plt.legend() plt.show()
额外检查项
- 确认代码中没有重复绘制同一条曲线的逻辑
- 如果使用
pandas绘图,检查plot方法是否正确指定了color参数,避免默认的分组配色
内容的提问来源于stack exchange,提问作者Alike minute
相关产品推荐
相关产品推荐

