基于双字典使用Plotly(优先Plotly Express)绘制多系列折线图的方法
多系列折线图实现方案
最优DataFrame结构设计
适配后续新增系列的需求,长格式(Tidy Data)DataFrame是Plotly Express的最优输入结构,完全兼容不同系列x轴值不对齐、长度不一致的场景(比如你示例中a系列x为[1,2,3],b系列x为[3,4,5]的情况)。
该结构仅需3列,后续新增任意数量折线都无需修改绘图代码:
series:存储折线的唯一标识(即原字典的key,如a/b)x:存储对应系列的x轴数值(即days字典的列表元素)y:存储对应系列的y轴数值(即vals字典的列表元素)
你示例数据转换后的长表结构如下:
| series | x | y |
|---|---|---|
| a | 1 | 10 |
| a | 2 | 20 |
| a | 3 | 30 |
| b | 3 | 9 |
| b | 4 | 16 |
| b | 5 | 25 |
现有字典转长格式DataFrame的代码
通用兼容写法(所有pandas版本支持)
import pandas as pd rows = [] # 遍历所有系列(前提:days和vals的key完全一一对应) for series_name in days.keys(): for x_val, y_val in zip(days[series_name], vals[series_name]): rows.append({ "series": series_name, "x": x_val, "y": y_val }) df = pd.DataFrame(rows)
简洁写法(pandas 1.3+支持)
import pandas as pd # 先构造以系列为行的中间表,再拆分为每行一个数据点的长表 df = pd.DataFrame({ "series": list(days.keys()), "x": list(days.values()), "y": list(vals.values()) }).explode(["x", "y"]) # 转换回数值类型(explode后默认会转为object类型) df[["x", "y"]] = df[["x", "y"]].astype(float)
Plotly Express 绘图代码
直接传入长表即可自动识别多系列,无需手动逐条绘制:
import plotly.express as px fig = px.line( df, x="x", # 指定x轴取值的列 y="y", # 指定y轴取值的列 color="series", # 按series列自动区分不同折线,自动生成图例、匹配颜色 title="多系列数值对应折线图" ) fig.show()
扩展说明
后续新增折线系列时,仅需在days和vals字典中新增对应key和数值列表,重新运行上述DataFrame转换代码,绘图代码完全不需要修改,即可自动生成新增折线的展示。
内容的提问来源于stack exchange,提问作者Lalit Jain
相关产品推荐
相关产品推荐

