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

