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

Plotly Express直方图:取消选择颜色(指标)时如何强制重新分箱?

使用Plotly Express Histogram取消选择指标后强制重新分箱的方法

当你用plotly.express.histogram绘制多指标对比直方图时,默认情况下取消选择某个图例项(比如示例中的Metric B),Plotly只是隐藏对应的数据系列,分箱规则仍基于初始全量数据计算,因此和单独绘制该指标的直方图样式不一致。要实现根据当前选中的指标动态重新分箱,需要借助Dash实现交互式更新,具体方案如下:

问题复现代码

import plotly.express as px
import pandas as pd
import numpy as np

dfA = pd.DataFrame({'Value': np.random.normal(0, 100, 1000)}).assign(Metric='A')
dfB = pd.DataFrame({'Value': np.random.normal(1000, 500, 1000)}).assign(Metric='B')

# 混合指标直方图
px.histogram(pd.concat([dfA, dfB]), color='Metric', barmode='overlay').show()
# 单独指标A的直方图
px.histogram(dfA, color='Metric', barmode='overlay').show()

解决方案:用Dash实现动态分箱更新

核心逻辑是监听图例的选择事件,根据选中的指标过滤数据,再重新计算分箱并绘制直方图。

完整代码示例:

import dash
from dash import dcc, html, Input, Output, State
import plotly.express as px
import pandas as pd
import numpy as np

# 生成数据
dfA = pd.DataFrame({'Value': np.random.normal(0, 100, 1000)}).assign(Metric='A')
dfB = pd.DataFrame({'Value': np.random.normal(1000, 500, 1000)}).assign(Metric='B')
df = pd.concat([dfA, dfB])

# 初始化Dash应用
app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Graph(id='histogram-graph'),
])

@app.callback(
    Output('histogram-graph', 'figure'),
    Input('histogram-graph', 'restyleData'),
    State('histogram-graph', 'figure')
)
def update_histogram(restyle_data, figure):
    # 初始状态:未修改图例选择
    if restyle_data is None:
        return px.histogram(df, color='Metric', barmode='overlay')
    
    # 获取当前图例的可见状态
    visible_values = restyle_data[0]['visible']
    # 提取所有指标名称
    metrics = [trace['name'] for trace in figure['data']]
    # 筛选出选中的指标
    selected_metrics = [metrics[i] for i, val in enumerate(visible_values) if val]
    
    # 无选中指标时返回空图表
    if not selected_metrics:
        return px.histogram(pd.DataFrame(), x='Value')
    
    # 过滤数据并重新绘制直方图(自动基于当前数据重新分箱)
    filtered_df = df[df['Metric'].isin(selected_metrics)]
    return px.histogram(filtered_df, color='Metric', barmode='overlay')

if __name__ == '__main__':
    app.run_server(debug=True)

效果说明

运行代码后在浏览器打开Dash应用:

  • 初始状态显示两个指标的对比直方图
  • 点击图例取消某个指标(比如B),图表会自动基于剩余选中的指标(A)重新计算分箱,样式和单独绘制dfA的直方图完全一致
  • 再次选中B时,会重新基于全量数据计算分箱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:22:37