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

Plotly循环添加Trace时实现图例灰度渐变且保留指定年份颜色

解决Plotly图表年份线条灰度渐变配置问题

需求说明

需要将Plotly图表中「Ano(年份)」图例下的年份线条设置为灰度渐变颜色,当前这些年份线条均为单一浅灰色,无法区分对应年份;但需保留最后一个年份(2023年)的蓝色样式不变。

实现思路

  1. 针对除最后一年外的所有年份,生成一组渐变的灰度值(灰度颜色的RGB通道值相同,调整0-1区间内的数值即可实现深浅变化)
  2. 循环添加trace时,为每个年份分配对应的灰度颜色
  3. 保留2023年的默认蓝色配置

修改后的完整代码

import pandas as pd
import plotly.graph_objects as go
from dash_bootstrap_templates import load_figure_template

# 读取并处理数据
df_decremento_municipio = pd.read_csv(
    "dash_estudo/decremento_municipio_202305291512.csv", index_col="view_date"
)
df_decremento_municipio.index = pd.to_datetime(df_decremento_municipio.index)
df_decremento_municipio = (
    df_decremento_municipio[["area_ha"]].groupby(df_decremento_municipio.index).sum()
)

lista_ano = df_decremento_municipio.index.year.unique()[
    df_decremento_municipio.index.year.unique() > 2017
]

df_empty = pd.DataFrame()
for ano in lista_ano:
    df = df_decremento_municipio.loc[df_decremento_municipio.index.year == ano]
    df["timedelta"] = (
        df.index - (df.index.year.astype("str") + "-01-01").astype("datetime64[ns]")
    ) / 1000000
    df["cumsum"] = df.loc[:, "area_ha"].cumsum()
    df_empty = pd.concat([df_empty, df[["timedelta", "cumsum"]]])

grafico_acumulado_tempo = go.Figure()

# 生成灰度渐变颜色列表:从深灰到浅灰,数量对应lista_ano[:-1]的长度
num_years = len(lista_ano[:-1])
# 灰度值范围:0.3(深灰)到0.8(浅灰),可根据需求调整区间
gray_values = [0.3 + (0.5 * i / (num_years - 1)) for i in range(num_years)]
gray_colors = [f"rgb({int(v*255)},{int(v*255)},{int(v*255)})" for v in gray_values]

# 循环添加前几年的trace,分配渐变灰度
for idx, ano in enumerate(lista_ano[:-1]):
    x_ = df_empty.loc[df_empty.index.year == ano, "timedelta"]
    y_ = df_empty.loc[df_empty.index.year == ano, "cumsum"]
    data = go.Scatter(
        x=x_,
        y=y_,
        mode="lines",
        name=ano,
        legendgrouptitle={"text": "Ano"},
        line={"color": gray_colors[idx]},  # 使用渐变灰度
        opacity=0.8,  # 微调透明度增强区分度
    )
    grafico_acumulado_tempo.add_trace(data)

# 添加2023年的trace,保留默认蓝色
ano_2023 = lista_ano[-1]
x_ = df_empty.loc[df_empty.index.year == ano_2023, "timedelta"]
y_ = df_empty.loc[df_empty.index.year == ano_2023, "cumsum"]
data = go.Scatter(
    x=x_,
    y=y_,
    mode="lines",
    name=ano_2023,
)
grafico_acumulado_tempo.add_trace(data)

# 图表布局配置
grafico_acumulado_tempo.update_layout(
    title="Acumulado Desflorestamento por Tempo",
    xaxis={"title": "Data", "type": "date"},
    yaxis={"title": "Área (ha)"},
    xaxis_tickformat="%d-%m",
    modebar={
        "remove": [
            "zoom", "pan", "select", "zoomIn", "zoomOut", "lasso2d", "autoscale"
        ]
    },
    separators=".",
    showlegend=True,
)

grafico_acumulado_tempo.show(config={'displaylogo': False})

关键修改点

  • 新增灰度颜色生成逻辑:通过计算生成从深到浅的灰度值列表,转换为RGB格式的颜色字符串
  • 循环中为每个年份trace分配对应的灰度颜色,替换原固定的lightgray
  • 微调透明度(opacity)增强不同年份线条的区分度
  • 修正最后一年trace的name参数,确保显示正确的2023年(原代码中name=ano会取循环最后一个值,存在bug)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:55:18