
本文介绍如何在 plotly express 生成的条形图中,默认隐藏指定数据系列(如 3 个分组中的 2 个),仅保留一个可见,其余需用户主动点击图例才显示,从而提升图表初始可读性与交互体验。
本文介绍如何在 plotly express 生成的条形图中,默认隐藏指定数据系列(如 3 个分组中的 2 个),仅保留一个可见,其余需用户主动点击图例才显示,从而提升图表初始可读性与交互体验。
Plotly Express(px)本身不直接支持“默认隐藏某几条迹线(trace)”的参数(例如 visible='legendonly' 无法通过 px.bar() 的 color 参数原生设定),但可通过其底层对象模型灵活实现:先用 px.bar() 创建基础图表,再遍历并修改对应 trace 的 visible 属性为 'legendonly'。
以下是一个完整、可复现的示例:
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
# 示例数据:3 个分类(A/B/C)在 4 个时间点上的数值
df = pd.DataFrame({
'x': ['Q1', 'Q2', 'Q3', 'Q4'] * 3,
'category': ['A'] * 4 + ['B'] * 4 + ['C'] * 4,
'value': [12, 18, 25, 20, 8, 11, 9, 14, 5, 7, 6, 8]
})
# 使用 px.bar 创建带 color 分组的条形图
fig = px.bar(df, x='x', y='value', color='category', barmode='group')
# 【关键步骤】遍历 traces,将 category='B' 和 'C' 对应的 trace 设为 legendonly
for i, trace in enumerate(fig.data):
if trace.name == 'B':
fig.data[i].visible = 'legendonly'
elif trace.name == 'C':
fig.data[i].visible = 'legendonly'
fig.update_layout(
title="默认仅显示 A 类别 — B 和 C 需点击图例激活",
legend_title_text="类别"
)
fig.show()✅ 效果说明:运行后图表初始仅显示类别 A 的条形;B 和 C 在图中不可见,但在图例中显示为未激活状态(灰色文字+勾选框为空),用户点击图例项即可动态显示/隐藏对应系列。
⚠️ 注意事项:
- visible='legendonly' 是 Plotly Graph Objects(go)层级的属性,不能直接传入 px.bar();必须在 px 返回的 Figure 对象上操作 fig.data。
- trace.name 默认等于 color 列的值(即 df['category'] 中的字符串),若自定义了 labels 或 category_orders,请确认 trace.name 实际值(可用 print([t.name for t in fig.data]) 调试)。
- 若使用 facet_col 或多子图,需对每个 subplot 中的 trace 单独处理;本例为单图场景,逻辑简洁通用。
- 此方法兼容导出(HTML/PNG)、Dash 集成及所有 Plotly 交互功能(缩放、悬停、下载等)。
? 进阶提示:若需批量控制(如除首个外全部隐藏),可用如下一行替代手动判断:
for i in range(1, len(fig.data)): # 索引 0 保持可见,其余隐藏
fig.data[i].visible = 'legendonly'通过该技巧,你能在保持 Plotly Express 快速建图优势的同时,精准掌控图例初始状态,让可视化更聚焦、更专业。










