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

Matplotlib中含NaN值时如何为每个月份分配唯一散点颜色?

解决散点图中NaN导致颜色与月份错位的问题

这个问题我之前也碰到过!根源在于scatter函数会自动忽略含NaN的数据点,但你的months_list还是保留了所有元素,导致剩下的有效数据点和颜色列表的索引对应关系乱掉了,自然就出现了颜色错位的情况。

解决思路

我们需要把NaN对应的日期和月份一起过滤掉,让有效数据、日期、月份三者的长度完全匹配,这样颜色就能和月份一一对应了。

完整示例代码

import numpy as np
import datetime
import matplotlib.pyplot as plt

# 示例数据
mydata = np.array([0.85405058, 0.78228784, np.nan, 0.72828138, 0.73757833, 0.69303712, 0.5730553, 0.57644895])
dates_list = [datetime.date(2017, 1, 5), datetime.date(2017, 5, 22), datetime.date(2017, 6, 14), datetime.date(2017, 8, 17), datetime.date(2017, 9, 27), datetime.date(2017, 10, 6), datetime.date(2017, 11, 23), datetime.date(2017, 12, 28)]
months_list= [1, 5, 6, 8, 9, 10, 11, 12]

# 过滤掉含NaN的条目:打包后过滤,再拆分
filtered = [(d, val, m) for d, val, m in zip(dates_list, mydata, months_list) if not np.isnan(val)]
filtered_dates, filtered_data, filtered_months = zip(*filtered)

# 绘制散点图
fig, ax = plt.subplots(1,1)
scatter = ax.scatter(filtered_dates, filtered_data, s=30, c=filtered_months, cmap='viridis')

# 可以添加颜色条来验证月份和颜色的对应关系
plt.colorbar(scatter, label='Month')
plt.show()

为什么这样有效?

通过列表推导式,我们只保留了mydata中非NaN的对应条目,确保filtered_dates、filtered_data、filtered_months的长度完全一致。此时再用filtered_months作为颜色参数,每个月份就能对应到正确的数据点,不会出现错位了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:24:00