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
相关产品推荐
相关产品推荐

