基于多级索引Pandas DataFrame绘制多条折线图及情绪趋势展示问题
实现方案
1. 数据预处理:转换为长格式
你当前的多级索引DataFrame首先需要做结构转换,方便plotly识别维度字段:
import pandas as pd import plotly.express as px # 先把多级行索引转为普通列 df = df.reset_index() # 重塑为长表:id_vars保留索引维度,其余字段转为「情绪指标-得分」的键值对结构 df_long = df.melt( id_vars = ["年份", "CES调查名称"], var_name = "情绪指标", value_name = "对应得分" )
2. 优化后的可视化方案
方案A:按年份分面,解决原分面不清晰问题
针对你之前用facet_cols的问题,增加布局调整参数即可大幅提升可读性:
fig = px.line( df_long, x = "CES调查名称", y = "对应得分", color = "情绪指标", facet_col = "年份", facet_col_wrap = 2, # 每行最多放2个子图,避免横向过挤 markers = True, # 增加数据点标记,避免折线波动无参考 line_shape = "linear" # 不需要平滑就用linear,需要平滑换spline ) # 调整坐标轴避免标签重叠 fig.update_xaxes(tickangle = 45) fig.update_layout( height = 600, # 手动设置画布高度 margin = dict(b = 100) # 底部留空放置倾斜的x轴标签 ) fig.show()
方案B:按情绪指标分面,单独查看各维度趋势
如果你更关注每个情绪指标本身的历年变化,可以调整分面维度:
fig = px.line( df_long, x = "CES调查名称", y = "对应得分", color = "年份", facet_col = "情绪指标", facet_col_wrap = 3, markers = True, # 如果不同情绪指标得分范围差异大,可打开下面参数让y轴自适应 # facet_y_scaling = "independent" ) fig.update_xaxes(tickangle = 45) fig.update_layout(height = 800) fig.show()
额外优化技巧
- 如果CES调查名称有时间先后顺序,可提前对
CES调查名称列做排序,保证x轴逻辑连贯 - 情绪指标数量过多的话,可先筛选需要展示的指标再绘图,避免线条太多混淆
- 需要导出静态图的话,可以用
fig.write_image("趋势图.png", scale=2)导出高分辨率版本
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

