如何用Plotly Python绘制每个ID含4个子ID折线图的图表?
解决方案
步骤1:按主ID拆分数据集到字典
先把数据集按主ID(假设是你的A列)拆分,每个主ID对应独立的子DataFrame,后续循环处理更清晰:
import pandas as pd import plotly.express as px # 先把日期列转成datetime类型,避免绘图时识别错误 df['C'] = pd.to_datetime(df['C']) # 按主ID分组,把每个组存入字典 id_data_dict = {main_id: group for main_id, group in df.groupby('A')}
步骤2:循环生成每个主ID的折线图
遍历字典里的每个主ID,用px.line直接生成包含4条子ID折线的图表——px.line会自动按子ID(B列)分组生成多条线条,不用手动逐个添加:
for main_id, sub_df in id_data_dict.items(): # 生成图表,x轴是日期C,y轴是数值D,用B列区分不同子ID的线条 fig = px.line(sub_df, x='C', y='D', color='B', title=f'主ID {main_id} 子ID趋势对比', labels={'C':'日期时间', 'D':'数值', 'B':'子ID'}) # 调整布局,让图表更直观 fig.update_layout(xaxis_tickformat='%Y-%m-%d %H:%M', # 自定义日期显示格式 legend_title='子ID', hovermode='x unified') # 鼠标悬停时同步显示所有子ID的数值 # 显示图表,也可以保存为HTML文件方便查看 fig.show() # fig.write_html(f'主ID_{main_id}_趋势图.html')
如果需要更精细控制(用Plotly Go)
要是想自定义每条线的颜色、样式,用plotly.graph_objects手动添加轨迹:
import plotly.graph_objects as go for main_id, sub_df in id_data_dict.items(): fig = go.Figure() # 遍历每个子ID,单独添加折线轨迹 for sub_id, sub_sub_df in sub_df.groupby('B'): fig.add_trace(go.Scatter(x=sub_sub_df['C'], y=sub_sub_df['D'], mode='lines+markers', # 同时显示线条和标记点 name=f'子ID {sub_id}', line=dict(width=2))) # 自定义线条宽度 fig.update_layout(title=f'主ID {main_id} 子ID趋势对比', xaxis_title='日期时间', yaxis_title='数值', legend_title='子ID') fig.show()
之前踩坑的原因
你之前用px.line效果不好,大概率是没按主ID拆分数据,直接用全量数据绘图会把所有主ID的线条混在一起;循环失败可能是分组逻辑没写对,用字典存储拆分后的DataFrame是正确思路,只是需要配合遍历生成图表。
内容的提问来源于stack exchange,提问作者newbie0001
相关产品推荐
相关产品推荐

