如何使用Python Plotly绘制按列分类的时间序列散点图
实现方案
你不需要手动为每一列创建固定数值的辅助列,核心解决思路是先把宽格式的日期数据表转换为长格式,再直接利用Plotly对分类轴的原生支持绘图,该方案可自动适配任意列数、任意数据量级,不需要逐列手动编写绘图逻辑。
核心步骤
- 用pandas的
melt方法将原始多列日期数据从宽表转为长表,自动生成「类别列」(存储原始数据的列名,如a、b)和「时间列」(存储对应的事件发生时间),无需手动给每个类别分配固定y值。 - 绘图时直接将y轴映射到类别列即可,Plotly会自动将分类值排布为独立的水平层级,同一类别的所有数据点会自然落在同一条水平线上。
最简实现代码(基于Plotly Express)
import plotly.express as px import pandas as pd # 原始数据,无需提前创建value_a、value_b这类辅助列 df = pd.DataFrame(dict( a=["2020-01-10", "2020-02-10", "2020-03-10", "2020-04-10", "2020-05-10", "2020-06-10"], b=["2020-01-05", "2020-02-15", "2020-03-18", "2020-08-10", "2021-05-10", "2021-06-10"] )) # 宽表转长表 df_long = df.melt(var_name="category", value_name="event_time") # 转换时间列为标准datetime格式,避免横轴识别异常 df_long["event_time"] = pd.to_datetime(df_long["event_time"]) # 一键生成散点图,无需逐列添加trace fig = px.scatter( df_long, x="event_time", y="category", color="category" # 不同类别自动分配不同颜色,不需要可删除该参数 ) # 保留原有x轴配置 fig.update_xaxes(showgrid=True, ticklabelmode="period") fig.show()
graph_objects版本实现
如果你习惯使用plotly.graph_objects接口,只需要遍历长表中的唯一类别自动生成trace即可,同样不需要手动给每个类别设置固定y值:
import plotly.graph_objects as go import pandas as pd df = pd.DataFrame(dict( a=["2020-01-10", "2020-02-10", "2020-03-10", "2020-04-10", "2020-05-10", "2020-06-10"], b=["2020-01-05", "2020-02-15", "2020-03-18", "2020-08-10", "2021-05-10", "2021-06-10"] )) df_long = df.melt(var_name="category", value_name="event_time") df_long["event_time"] = pd.to_datetime(df_long["event_time"]) fig = go.Figure() # 自动遍历所有类别生成对应散点轨迹 for cat in df_long["category"].unique(): cat_subset = df_long[df_long["category"] == cat] fig.add_trace(go.Scatter( mode="markers", x=cat_subset["event_time"], y=cat_subset["category"], name=cat )) fig.update_xaxes(showgrid=True, ticklabelmode="period") fig.show()
适配说明
后续新增数据列时,只需要在原始DataFrame中添加对应列即可,不需要修改任何绘图逻辑,melt会自动识别所有列并转换为对应的纵轴分类,即使是上百列、百万级数据点也可以正常处理。
内容的提问来源于stack exchange,提问作者jB777
相关产品推荐
相关产品推荐

