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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:10:03