Python 2.7下Pyplot处理NaN绘图时的连线问题求解
嘿Julian,我刚好遇到过这个问题!Matplotlib默认遇到NaN就会打断连线,不过我们有简单的办法,不用填充或删除NaN就能让线连起来,同时保留原x/y的长度。
首先得提一下,你代码里的"nan"是字符串类型,Matplotlib没法把它当成数值型的缺失值处理,得先转成numpy.nan才行,不然连点都画不对。
解决方案1:用numpy掩码数组(最简洁)
我们可以把y数组转换成掩码数组,把NaN的位置标记为无效,Matplotlib会自动跳过这些无效位置,让有效点之间的连线保持连续,同时原x和y的长度完全不变。
修改后的代码:
import matplotlib.pyplot as plt import numpy as np x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] y = [1, 2, 5, 4, 7, "nan", 4, 2, 5, 4, 4, 1] # 把字符串"nan"转为真正的数值NaN,并转成numpy数组 y_np = np.array(y, dtype=np.float64) # 创建掩码数组,标记NaN的位置为无效 y_masked = np.ma.masked_invalid(y_np) # 直接绘制掩码数组,线会自动跳过NaN连接有效点 plt.plot(x, y_masked, 'o-', linewidth=0.5) plt.show()
解决方案2:手动提取有效点画线
如果你不想用掩码数组,也可以手动筛选出y中不是NaN的点,单独画连线,再叠加所有点的标记,效果完全一致:
import matplotlib.pyplot as plt import numpy as np x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] y = [1, 2, 5, 4, 7, "nan", 4, 2, 5, 4, 4, 1] y_np = np.array(y, dtype=np.float64) # 获取所有非NaN的索引 valid_indices = ~np.isnan(y_np) # 先画连线:只用有效点,这样线就不会断开 plt.plot(np.array(x)[valid_indices], y_np[valid_indices], '-', linewidth=0.5) # 再画所有点标记(NaN的位置不会显示点) plt.plot(x, y_np, 'o', markersize=4) plt.show()
这两种方法都不会修改原x和y的长度,也不用填充任何计算值,完美符合你的要求。线会跳过NaN的位置,把前后的有效点连接起来,同时点标记只会显示有数值的位置。
内容的提问来源于stack exchange,提问作者J. R.
相关产品推荐
相关产品推荐

