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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:17:48