Plotly:不使用Traces时修改图例名称的实现方法求助
解决Plotly Express折线图图例项名称修改问题
我完全懂你的痛点——想用Plotly Express改图例里的项名称,搜了一堆方法但不用Traces就不管用,而且已经会改图例标题了,就差图例项这块。咱们来一步步调整你的代码解决这个问题。
问题根源
你现在直接把三个列表传给px.line的y参数,Plotly会自动给这些系列分配默认名称(比如y0、y1、y2),所以需要手动指定这些系列的自定义名称。另外提一句,你之前x = dates没用是因为dates包含了前两列(Region和Categoria),得先过滤出真正的日期列才行。
方案1:直接用px.line的labels参数修改
这种方法不用重构数据,直接在现有代码基础上添加labels参数,把自动生成的y0、y1、y2映射成你想要的名称:
import pandas as pd import plotly.express as px import numpy as np def camasRegion(): df = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto52/Camas_UCI.csv') # 过滤出真正的日期列(跳过前两列) dates = df.columns[2:] habilitadas = [] ocupadasCovid = [] ocupadasNoCovid = [] region = 'Ñuble' for i in range(len(df)): if df.values[i][0] == region: if df.values[i][1] == 'Camas UCI habilitadas': # 只取日期对应的值,跳过前两列 habilitadas = df.values[i][2:] if df.values[i][1] == 'Camas UCI ocupadas COVID-19': ocupadasCovid = df.values[i][2:] if df.values[i][1] == 'Camas UCI ocupadas no COVID-19': ocupadasNoCovid = df.values[i][2:] fig = px.line( y = [habilitadas, ocupadasCovid, ocupadasNoCovid], x = dates, # 现在可以直接用日期列了 title=f'Camas por región: ({region})', # 关键:用labels映射图例项名称 labels={ 'y0': 'Camas UCI habilitadas', 'y1': 'Camas UCI ocupadas COVID-19', 'y2': 'Camas UCI ocupadas no COVID-19' } ) fig.add_annotation( x = 1, y = -0.1, text = 'Fuente: Datos obtenidos desde el Ministerio de Ciencia.', showarrow = False, xref='paper', yref='paper', xanchor='right', yanchor='auto', xshift=0, yshift=-20 ) fig.update_layout( legend_title_text='Estado de cama', xaxis_title="Fecha", # 改成Fecha更准确 yaxis_title="Cantidad de camas", ) fig.show() camasRegion()
方案2:重构数据为长格式(更推荐)
Plotly Express天生更适合处理长格式数据(每一行是一个观测值),这种方式不仅能自动生成正确的图例名称,代码也更简洁易维护:
import pandas as pd import plotly.express as px def camasRegion(): df = pd.read_csv('https://raw.githubusercontent.com/MinCiencia/Datos-COVID19/master/output/producto52/Camas_UCI.csv') region = 'Ñuble' # 筛选目标区域的数据,然后把宽格式转成长格式 df_region = df[df['Region'] == region] df_long = df_region.melt( id_vars=['Region', 'Categoria'], var_name='Fecha', value_name='Cantidad de camas' ) # 直接用px.line,color参数对应Categoria,自动生成图例项 fig = px.line( df_long, x='Fecha', y='Cantidad de camas', color='Categoria', title=f'Camas por región: ({region})' ) fig.add_annotation( x = 1, y = -0.1, text = 'Fuente: Datos obtenidos desde el Ministerio de Ciencia.', showarrow = False, xref='paper', yref='paper', xanchor='right', yanchor='auto', xshift=0, yshift=-20 ) fig.update_layout( legend_title_text='Estado de cama', xaxis_title="Fecha", yaxis_title="Cantidad de camas", ) fig.show() camasRegion()
这种方法不需要手动处理列表,color='Categoria'会直接用Categoria列的内容作为图例项名称,完全符合你的需求,而且代码逻辑更清晰。
内容的提问来源于stack exchange,提问作者MrPie
相关产品推荐
相关产品推荐

