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

Plotly Express散点子图图例重复问题求助

解决Plotly子图共用图例重复的问题

你现在的问题是每个子图都添加了一整套对应分类的trace,每个trace默认都会显示图例项,导致同一个分类重复出现多次。只需要让第一个子图的trace显示图例,其余子图的trace隐藏图例,同时保证所有同分类trace的名称一致,就能实现共用一个图例的效果。

修改后的代码如下:

num_subplots = len(column_y)
rows = (num_subplots + 1) // 2  # 根据子图数量计算行数
cols = 2 if num_subplots > 1 else 1  # 根据子图数量设置列数

# 存储图例标签的字典
legend_labels = {}

# 遍历颜色列的唯一分类
for cat in df[color_column].unique().tolist():
    # 提取分类的标签
    legend_labels[cat] = str(cat).split(": ", 1)[0]

fig = make_subplots(rows=rows, cols=cols, subplot_titles=column_y, shared_xaxes=True, shared_yaxes=True, vertical_spacing=0.1, horizontal_spacing=0.1)

# 绘制带颜色分类的散点子图
for i, col_y in enumerate(column_y, start=1):
    scatter = px.scatter(df, x=column_x, y=col_y, color=color_column, color_discrete_sequence=custom_palette, opacity=0.8)
    scatter.update_traces(marker=dict(size=5))
    scatter.for_each_trace(lambda trace: trace.update(name=legend_labels.get(trace.name, trace.name)))

    row_num = (i + 1) // 2 if num_subplots > 1 else 1
    col_num = (i % 2) + 1 if num_subplots > 1 else 1
    
    # 关键修改:只有第一个子图的trace显示图例
    show_legend = (i == 1)
    for trace in scatter.data:
        fig.add_trace(trace.update(showlegend=show_legend), row=row_num, col=col_num)

关键修改说明:

  • 添加了show_legend = (i == 1)判断,仅第一个子图的trace会显示图例项
  • 通过trace.update(showlegend=show_legend)控制每个trace的图例显示状态
  • 因为所有同分类的trace名称和颜色都保持一致,Plotly会自动将它们关联到同一个图例项,点击图例时所有子图的对应分类点都会同步显示/隐藏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:45:21