You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Plotly如何通过groupby按分组设置时序图轨迹颜色

问题根因

手动拆分分组绘制时所有trace颜色统一为最后一次设置的值,本质是颜色赋值逻辑作用域错误:要么是在循环外全局设置了线条颜色覆盖了单trace配置,要么是循环内传参时引用了被反复覆盖的临时颜色变量,和原生Plotly的接口能力无关。原生Plotly不需要依赖Plotly Express的color参数,即可实现按分组匹配独立颜色的时序图。

实现步骤
  • 提前提取DataFrame中所有唯一分组值,准备长度匹配的离散色板,建立分组和颜色的一一映射关系,避免颜色错乱。可以直接用Plotly内置的优质离散色板,也可以自定义十六进制颜色列表。
  • 按Group字段分组遍历,每次迭代取当前分组的子集数据、分组名称、对应的专属颜色。
  • 每次迭代中单独创建go.Scatter对象,显式给当前trace的line.color参数传入当前分组对应的颜色,禁止在循环外通过全局配置统一设置线条颜色。
  • 所有trace添加完成后,统一配置横轴、纵轴、图例等布局属性即可。
可运行参考代码
import pandas as pd
import plotly.graph_objects as go
from plotly.colors import qualitative

# 构造和你结构一致的测试数据
df = pd.DataFrame({
    "Group": ["Grp1"]*3 + ["Grp2"]*3,
    "Dtime": ["2015-01-01", "2015-01-02", "2015-01-03"]*2,
    "Value": [1261.406773, 1252.660231, 1223.076426, 1214.402352, 1422.532532, 1262.990213]
})
# 提前转换时间格式,避免横轴被识别为分类值导致时序错乱
df["Dtime"] = pd.to_datetime(df["Dtime"])

# 生成分组-颜色映射
unique_groups = df["Group"].unique()
# 取Plotly内置离散色板,长度和分组数一致即可
color_palette = qualitative.Plotly[:len(unique_groups)]
group_color_map = dict(zip(unique_groups, color_palette))

fig = go.Figure()
# 循环添加每个分组的时序线
for group, sub_df in df.groupby("Group"):
    fig.add_trace(
        go.Scatter(
            x=sub_df["Dtime"],
            y=sub_df["Value"],
            name=group, # 图例显示的分组名称
            # 核心:当前trace单独指定颜色,不要挪到循环外全局设置
            line=dict(color=group_color_map[group], width=2),
            mode="lines"
        )
    )

# 布局配置
fig.update_layout(
    title="Value时序变化图",
    xaxis_title="日期",
    yaxis_title="Value取值",
    legend_title="分组"
)
fig.show()
常见踩坑说明
  • 不要在fig.update_layout中全局设置line.color属性,全局配置优先级高于单trace配置,会把所有trace的颜色覆盖为同一个值,这也是绝大多数人遇到“所有线颜色一致”问题的直接原因。
  • 循环内传参时不要直接引用循环外定义的单个颜色变量,否则变量会随循环迭代被覆盖,最终所有trace引用的都是最后一次循环赋的颜色值。
  • 如果分组数量超过内置色板长度,直接扩展自定义颜色列表即可,支持十六进制、RGB、rgba等所有标准颜色格式。

内容的提问来源于stack exchange,提问作者dinn_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:18:07