Plotly多组数据重叠概率直方图概率值异常问题求助
问题解决方法
核心问题分析
barmode='relative'的异常概率:这个模式会将多组直方图的数值进行加减叠加,并非单组的概率归一化计算,多组叠加后概率值会累加,导致远高于单组的6%,完全不适合用来展示单组的概率分布对比。overlay模式与Excel不符:Plotly默认会为每组数据单独计算直方图的bin区间,三组数据的bin边界、范围不一致,导致每组的概率计算基于不同的区间,自然和Excel中统一bin区间下计算的概率结果不符。
解决步骤
1. 统一三组数据的直方图bin区间
必须让三组数据使用完全相同的bin范围和边界,才能保证概率计算的基准一致,和Excel结果对齐:
- 先计算所有三组数据的全局最小值和最大值,确定bin的整体范围
- 生成固定数量的等宽bin区间
2. 修改代码实现统一bin
import plotly.graph_objects as go import numpy as np import pandas as pd # 假设你的df已经包含DataA、DataB、DataC df['DataA'] = .... df['DataB'] = .... df['DataC'] = .... # 计算全局的bin范围和区间 all_data = pd.concat([df['DataA'], df['DataB'], df['DataC']]) bin_min = all_data.min() bin_max = all_data.max() num_bins = 1000 # 保持和原代码一致的bin数量 # 生成统一的等宽bin区间 bin_size = (bin_max - bin_min) / num_bins histnorm = 'probability' # 初始化图表 fig = go.Figure() # 添加每组数据的直方图,强制使用统一bin参数 fig.add_trace(go.Histogram( x=df['DataA'], xbins=dict(start=bin_min, end=bin_max, size=bin_size), histnorm=histnorm, name='Data A', opacity=0.7 )) fig.add_trace(go.Histogram( x=df['DataB'], xbins=dict(start=bin_min, end=bin_max, size=bin_size), histnorm=histnorm, name='Data B', opacity=0.7 )) fig.add_trace(go.Histogram( x=df['DataC'], xbins=dict(start=bin_min, end=bin_max, size=bin_size), histnorm=histnorm, name='Data C', opacity=0.7 )) # 配置图表样式 fig.update_layout( title='My Chart', barmode='overlay', xaxis=dict(title='', showline=True, showgrid=False), yaxis=dict(title='', showline=True, showgrid=False, tickformat=',.0%') ) fig.show()
关键修改点说明
- 用全局数据的极值计算统一bin的范围和宽度,确保三组数据的每个bin对应的x轴区间完全一致
- 显式指定每组直方图的
xbins参数,强制使用统一的bin规则 histnorm='probability'会对每组数据单独做概率归一化(每组所有bin的概率和为100%),和Excel中“每组在统一bin下计算频率/概率”的逻辑完全匹配
额外验证建议
可以抽取几组bin区间,手动计算每组数据在该区间内的数量占比,和Excel的结果对比,确认bin统一后概率值是否对齐。
内容的提问来源于stack exchange,提问作者user13735688
相关产品推荐
相关产品推荐

