如何在Plotly中绘制可自定义分箱的双组连续柱状直方图?
在Plotly中复刻自定义分箱的双组直方图
要在Plotly中实现和Matplotlib一致的自定义3分箱双组直方图,核心是手动控制分箱逻辑,避免Plotly自动分箱的差异。以下是具体实现方案:
步骤1:手动计算分箱频数
用numpy.histogram按照指定分箱数计算两组数据的频数,确保和Matplotlib的bins=3逻辑对齐(默认等宽分箱):
import numpy as np import plotly.graph_objects as go # 替换为你的真实数据 total_cu = np.random.uniform(0, 100, size=100) valid_cu = np.random.uniform(0, 100, size=70) # 定义分箱数,和Matplotlib一致 num_bins = 3 # 生成等宽分箱区间,覆盖两组数据的极值 bins = np.linspace( min(min(total_cu), min(valid_cu)), max(max(total_cu), max(valid_cu)), num_bins + 1 ) # 计算每组数据在各分箱的频数 total_counts, _ = np.histogram(total_cu, bins=bins) valid_counts, _ = np.histogram(valid_cu, bins=bins) # 生成可读性强的分箱标签(用于x轴) bin_labels = [f"[{bins[i]:.1f}, {bins[i+1]:.1f})" for i in range(num_bins)] bin_labels[-1] = bin_labels[-1].replace(")", "]") # 最后一个区间改为闭合格式
步骤2:用Plotly Bar绘制分组直方图
通过barmode='group'实现双组条形并排,完全复刻Matplotlib的直方图效果:
fig = go.Figure() # 添加Total Data组 fig.add_trace(go.Bar( x=bin_labels, y=total_counts, name="Total Data", marker_color="#1f77b4" )) # 添加Valid Data组 fig.add_trace(go.Bar( x=bin_labels, y=valid_counts, name="Valid Data", marker_color="#2ca02c" )) # 配置布局 fig.update_layout( barmode="group", title="CU值分布(自定义3分箱)", xaxis_title="CU值区间", yaxis_title="频数", legend_title="数据分组", bargap=0.15 # 调整组内条形间距 ) fig.show()
关键说明
- 手动分箱彻底避免了Plotly自动分箱算法(如Sturges'规则)与Matplotlib的差异,确保数值完全一致。
- 若需要非等宽分箱,直接修改
bins数组即可(例如bins=[0, 25, 75, 100]),灵活性拉满。 - 此前用Plotly Histogram出现数值错误,本质是其默认分箱逻辑和Matplotlib不同,手动计算是最可靠的解决方式。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

