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

如何解决Plotly图表中标记标注显示NaN值的问题

问题:图表中Major字段标注显示NaN的解决办法?

我尝试绘制三类版本的数量图,但Major字段的标注始终显示NaN(仅出现在2015年),Patch字段同样有None值却没有这个问题,求解决方法。

我的数据集

import pandas as pd

data = [
    {'Year': 2015, 'major': None, 'minor': 57.0, 'patch': None},
    {'Year': 2016, 'major': 129.0, 'minor': 107.0, 'patch': 437.0},
    {'Year': 2017, 'major': 109.0, 'minor': 266.0, 'patch': 2622.0},
    {'Year': 2018, 'major': 61.0, 'minor': 3213.0, 'patch': 2989.0},
    {'Year': 2019, 'major': 2906.0, 'minor': 9780.0, 'patch': 16531.0},
    {'Year': 2020, 'major': 421.0, 'minor': 8447.0, 'patch': 9402.0},
    {'Year': 2021, 'major': 1156.0, 'minor': 13102.0, 'patch': 10323.0},
    {'Year': 2022, 'major': 246.0, 'minor': 8770.0, 'patch': 24588.0}
]

df2 = pd.DataFrame(data)

绘图代码

import plotly.graph_objects as go

fig = go.Figure()
fig.add_trace(go.Scatter(x=df2['Year'], y=df2['major'], name='Major', mode='lines+markers', marker=dict(color='brown', size=10), line=dict(color='brown', width=1)))
fig.add_trace(go.Scatter(x=df2['Year'], y=df2['minor'], name='Minor', mode='lines+markers', marker=dict(color='orange', size=10), line=dict(color='orange', width=1)))
fig.add_trace(go.Scatter(x=df2['Year'], y=df2['patch'], name='Patch', mode='lines+markers', marker=dict(color='blue', size=10), line=dict(color='blue', width=1)))

for row in df2.itertuples():
    fig.add_annotation(x=row.Year, y=row.major, text=str(row.major), showarrow=False, arrowhead=1, yshift=10)
    fig.add_annotation(x=row.Year, y=row.minor, text=str(row.minor), showarrow=False, arrowhead=1, yshift=20)
    fig.add_annotation(x=row.Year, y=row.patch, text=str(row.patch), showarrow=False, arrowhead=1, yshift=10)

fig.update_xaxes(showline=True, linewidth=1, linecolor='black', mirror=True)
fig.update_yaxes(showline=True, linewidth=1, linecolor='black', mirror=True)
fig.update_layout(width=1500, height=900,legend_title_text='Type of Change',template='ggplot2', title = 'Evolution of Breaking Changes over all Releases', xaxis_title = 'Year', yaxis_title = 'Number of Breaking Changes')
fig.update_traces(mode='lines+markers')

fig.show()

问题截图

问题截图


解决办法

问题根源是循环添加标注时未过滤NaN/None值:当row.major为None时,pandas会将其转为NaN,str(row.major)会生成字符串"nan",同时y轴值为NaN导致标注被默认放置在图表顶部,从而显示出NaN字样;而Patch字段的标注虽同样有None,但因y轴值无效未被渲染在可见区域。

修改循环部分代码,添加非空判断,同时将浮点数值转为整数显示更美观:

for row in df2.itertuples():
    # 仅当Major值非空时添加标注
    if pd.notna(row.major):
        fig.add_annotation(x=row.Year, y=row.major, text=str(int(row.major)), showarrow=False, arrowhead=1, yshift=10)
    # 仅当Minor值非空时添加标注
    if pd.notna(row.minor):
        fig.add_annotation(x=row.Year, y=row.minor, text=str(int(row.minor)), showarrow=False, arrowhead=1, yshift=20)
    # 仅当Patch值非空时添加标注
    if pd.notna(row.patch):
        fig.add_annotation(x=row.Year, y=row.patch, text=str(int(row.patch)), showarrow=False, arrowhead=1, yshift=10)

替换原循环代码后,NaN标注会被自动过滤,同时所有数值会以整数形式显示。


内容的提问来源于stack exchange,提问作者Brie MerryWeather

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:44:59