matplotlib 3.5.3中plt.scatter对datetime数据不遵循掩码规则
Matplotlib 3.5.3中scatter显示掩码数组数据的问题解决
在matplotlib 3.5.3版本中,使用numpy掩码数组结合datetime列表绘图时,plt.plot会自动忽略被掩码的数据点,表现符合预期,但plt.scatter却会绘制被掩码的点,仅轴限计算能正确排除掩码值。即使将时间序列也转为相同掩码的数组,问题依然存在。
问题原因
这是matplotlib 3.5.3版本的已知bug:scatter函数未正确处理numpy掩码数组的掩码标识,而plot函数的掩码逻辑是正常的。
解决方法
方法1:手动过滤掩码数据
提取未被掩码的时间点和数据点,再传入scatter函数:
import matplotlib.pyplot as plt import numpy.ma as ma from datetime import datetime time_unmasked = [datetime(2022, 11, 24, 4, 49, 52), datetime(2022, 11, 24, 4, 49, 53), datetime(2022, 11, 24, 4, 49, 54), datetime(2022, 11, 24, 4, 49, 55), datetime(2022, 11, 24, 4, 49, 56), datetime(2022, 11, 24, 4, 49, 57), datetime(2022, 11, 24, 4, 49, 58)] data_masked = ma.array([15,14,50,15,15,15,16], mask=[0,0,1,1,1,0,0]) # 提取未掩码的索引 valid_indices = ~data_masked.mask # 过滤时间和数据 valid_times = [t for t, valid in zip(time_unmasked, valid_indices) if valid] valid_data = data_masked[valid_indices] # 散点图(符合预期,不显示掩码点) plt.scatter(valid_times, valid_data) plt.show()
方法2:升级matplotlib版本
该bug在matplotlib 3.6及以上版本中已被修复,升级后直接运行原代码即可让scatter自动忽略掩码数据:
pip install --upgrade matplotlib>=3.6
内容的提问来源于stack exchange,提问作者Ben Pickering
相关产品推荐
相关产品推荐

