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

Python中结合if-else条件语句用go.Scatter实现散点分色求助

问题原因梳理

原代码存在以下错误导致无法达到预期效果:

  • 循环内每次都重新初始化go.Figure()对象,之前添加的trace都会被清空
  • 循环内每次都调用fig.show(),会生成和数据行数相等的独立图表,而非所有点在同一张图展示
  • 添加trace时传入的是全量DataFrame数据,没有按类别筛选子集,导致颜色无法对应分类
  • 用逐行循环给T_or_NonT列赋值,效率极低,不符合pandas向量化操作的最佳实践
正确实现代码(基于plotly.graph_objects)
import pandas as pd
import plotly.graph_objects as go

# 第一步:生成分类列,pandas向量化操作不需要逐行循环
df.loc[df['A'] <= 200, 'T_or_NonT'] = 'Non-T'
df.loc[df['A'] > 200, 'T_or_NonT'] = 'T'

# 执行下方代码可打印验证你需要的表格格式
# print(df[['Date', 'A', 'T_or_NonT']])

# 第二步:仅初始化一次画布
fig = go.Figure()

# 第三步:分别添加两类数据的trace
# Non-T类标记为绿色
fig.add_trace(go.Scatter(
    x = df[df['T_or_NonT'] == 'Non-T']['Date'],
    y = df[df['T_or_NonT'] == 'Non-T']['A'],
    mode = 'markers',
    name = 'Non-T',
    marker = dict(color = 'green')
))

# T类标记为红色
fig.add_trace(go.Scatter(
    x = df[df['T_or_NonT'] == 'T']['Date'],
    y = df[df['T_or_NonT'] == 'T']['A'],
    mode = 'markers',
    name = 'T',
    marker = dict(color = 'red')
))

# 可选:自定义图表信息
fig.update_layout(
    title = '月度降雨量散点图',
    xaxis_title = '月份',
    yaxis_title = '降雨量',
    showlegend = True
)

# 仅调用一次绘图方法
fig.show()
更简单的替代方案(plotly.express)

plotly.express是高层API,不需要手动拆分trace,自动按分类列分配颜色,更适合入门使用:

import pandas as pd
import plotly.express as px

# 生成分类列逻辑和上文一致
df.loc[df['A'] <= 200, 'T_or_NonT'] = 'Non-T'
df.loc[df['A'] > 200, 'T_or_NonT'] = 'T'

# 一行代码完成绘图,自动按分类匹配颜色
fig = px.scatter(
    df,
    x = 'Date',
    y = 'A',
    color = 'T_or_NonT',
    color_discrete_map = {'T':'red', 'Non-T':'green'},
    title = '月度降雨量散点图',
    labels = {'A':'降雨量', 'Date':'月份'}
)

fig.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:06:09