Plotly Express中如何不改变图表形状按SITE_NUM升序重排图例
解决Plotly图例按指定顺序排列且不改变图表形状的问题
可以直接在绘图后调整图例顺序,不用重新排序数据破坏图表形状。核心逻辑是:Plotly的图例顺序由图中traces的顺序决定,我们只需要重新排列traces的顺序,就能改变图例展示顺序,同时不影响图表的原有形状(因为数据已经按VALUE排好序,每个trace的数据源没变化)。
修改后的完整代码
import pandas as pd import plotly.express as px # 原有数据处理逻辑 temp_dataframe = pd.DataFrame() temp_dataframe['VALUE'] = relevant_dataframe.RESULT.tolist() temp_dataframe['SITE_NUM'] = relevant_dataframe.SITE_NUM.tolist() temp_dataframe.sort_values('VALUE', inplace = True) temp_dataframe['IDX'] = list(range(len(temp_dataframe))) # 生成初始图表(保持原有形状) fig=px.line(temp_dataframe, x = 'VALUE', y = 'IDX', color='SITE_NUM') fig.update_layout( yaxis = dict( tickmode = 'array', tickvals = (len(temp_dataframe)-1) * p/100, ticktext = p ) ) # ------------------- 新增:调整图例顺序的代码 ------------------- # 获取SITE_NUM的唯一值并按升序排序 sorted_sites = sorted(temp_dataframe['SITE_NUM'].unique()) # 根据排序后的站点顺序重新排列traces sorted_traces = [] for site in sorted_sites: # 匹配对应站点的trace(Plotly会把数字类型的SITE_NUM转成字符串作为trace.name) for trace in fig.data: if trace.name == str(site): sorted_traces.append(trace) break # 更新图表的traces顺序 fig.data = sorted_traces # 确保图例按trace顺序显示(默认就是normal,可省略,明确写出更清晰) fig.update_layout(legend={'traceorder': 'normal'}) # ------------------------------------------------------------- fig.show()
关键说明
- 原代码里的
len(d)修正为len(temp_dataframe),避免变量未定义报错。 - 如果你的
SITE_NUM本身是字符串类型,把str(site)改成site即可匹配trace.name。 - 调整traces顺序后,每个trace对应的数据源还是原来按VALUE排序后的数据集,所以图表的线条形状完全不会改变,只有图例的顺序变成了SITE_NUM的升序。
内容的提问来源于stack exchange,提问作者zyy
相关产品推荐
相关产品推荐

