Plotly循环添加Trace时实现图例灰度渐变且保留指定年份颜色
解决Plotly图表年份线条灰度渐变配置问题
需求说明
需要将Plotly图表中「Ano(年份)」图例下的年份线条设置为灰度渐变颜色,当前这些年份线条均为单一浅灰色,无法区分对应年份;但需保留最后一个年份(2023年)的蓝色样式不变。
实现思路
- 针对除最后一年外的所有年份,生成一组渐变的灰度值(灰度颜色的RGB通道值相同,调整0-1区间内的数值即可实现深浅变化)
- 循环添加trace时,为每个年份分配对应的灰度颜色
- 保留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
相关产品推荐
相关产品推荐

