Matplotlib绘制带误差棒图表遇None值报错,如何保留对应days值?
解决Matplotlib绘制带None值的误差棒报错问题
问题场景
需要在同一张图表绘制两组带误差棒的数据,其中magB的第一个测量值为None,运行代码触发TypeError(无法对NoneType与float执行加法操作),且不能忽略第一个days值(后续需用于更多绘图)。
原代码
import matplotlib.pyplot as plt import numpy as np days = [0.43, 1.72, 3.97, 4.81, 9.54, 10.9] magB = [None, 3.36, 3.9, 4.27, 5.47, 5.59] magV = [10.8, 2.88, 3.59, 3.89, 5.57, 5.82] fig, ax = plt.subplots() plt.xlabel("days") plt.ylabel("mag") plt.yticks(np.arange(3, 6, 0.5)) plt.scatter(days, magB, label='magB') plt.scatter(days, magV, label='magV') plt.errorbar(days, magB, yerr=1, fmt="o") plt.errorbar(days, magV, xerr=1, fmt="o") plt.legend() ax.invert_yaxis() plt.show()
报错信息
File "test.py", line 26, in <module> plt.errorbar(days, magB, yerr=0.1, fmt="o") File "matplotlib/pyplot.py", line 2537, in errorbar return gca().errorbar( File "matplotlib/__init__.py", line 1442, in inner return func(ax, *map(sanitize_sequence, args), **kwargs) File "matplotlib/axes/_axes.py", line 3648, in errorbar low, high = dep + np.row_stack([-(1 - lolims), 1 - uplims]) * err TypeError: unsupported operand type(s) for +: 'NoneType' and 'float' Process finished with exit code 1
解决方案
方法1:为magB过滤出有效数据对应的days子集
保留完整的days数组用于后续绘图,同时为magB单独生成仅包含有效数值的数据集和对应的days片段:
import matplotlib.pyplot as plt import numpy as np days = [0.43, 1.72, 3.97, 4.81, 9.54, 10.9] magB = [None, 3.36, 3.9, 4.27, 5.47, 5.59] magV = [10.8, 2.88, 3.59, 3.89, 5.57, 5.82] # 过滤magB的有效数据及对应的days valid_magB = [val for val in magB if val is not None] valid_days_magB = [days[i] for i, val in enumerate(magB) if val is not None] fig, ax = plt.subplots() plt.xlabel("days") plt.ylabel("mag") plt.yticks(np.arange(3, 6, 0.5)) # 绘制magB时用过滤后的数据集 plt.scatter(valid_days_magB, valid_magB, label='magB') plt.scatter(days, magV, label='magV') plt.errorbar(valid_days_magB, valid_magB, yerr=1, fmt="o") plt.errorbar(days, magV, xerr=1, fmt="o") plt.legend() ax.invert_yaxis() plt.show() # 完整的days数组仍可用于后续绘图 print("完整days数组:", days)
方法2:将None替换为numpy.nan
Matplotlib会自动忽略nan值,无需修改days数组,直接替换即可:
import matplotlib.pyplot as plt import numpy as np days = [0.43, 1.72, 3.97, 4.81, 9.54, 10.9] # 将None替换为np.nan magB = [np.nan if val is None else val for val in [None, 3.36, 3.9, 4.27, 5.47, 5.59]] magV = [10.8, 2.88, 3.59, 3.89, 5.57, 5.82] fig, ax = plt.subplots() plt.xlabel("days") plt.ylabel("mag") plt.yticks(np.arange(3, 6, 0.5)) plt.scatter(days, magB, label='magB') plt.scatter(days, magV, label='magV') plt.errorbar(days, magB, yerr=1, fmt="o") plt.errorbar(days, magV, xerr=1, fmt="o") plt.legend() ax.invert_yaxis() plt.show() # 完整days数组仍保留可用于后续操作 print("完整days数组:", days)
两种方法都能解决报错问题,同时保留完整的days数组供后续绘图使用。
内容的提问来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

