sns.histplot设置bins参数未生成指定数量分箱的原因及解决方法
问题原因
你在调用sns.histplot()时同时传入了binwidth和bins两个分箱控制参数,seaborn底层逻辑中binwidth的优先级高于bins,当两个参数同时存在时,程序会忽略你设置的bins取值,仅按照指定的步长计算分箱数量,所以你看到的分箱数和你设置的bins不一致。
以你给出的测试代码为例,col1的取值范围是1到15,binwidth=2的情况下,实际计算得到的分箱数约为7个,和你实际输出的图表分箱数匹配。
解决方案
根据你的需求选择对应修改方式即可:
- 如果你需要固定分箱总数,直接删除
binwidth参数,仅保留bins参数即可,修改后的代码示例如下:
测试代码修改版:
import pandas as pd import seaborn as sns d = {'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9 , 10 , 11 , 12, 13, 14, 15], 'col2': [1, 1, 1, 1, 1, 1, 2, 2, 2 , 2 , 2, 2, 2, 2, 2]} df = pd.DataFrame(data=d) sns.histplot(data=df, x='col1', multiple='dodge', hue='col2', bins=8)
业务代码修改版:
hist = sns.histplot(data=Data, x=y_data, multiple='dodge', ax=axes[0], hue=i[2][1], bins=10)
- 如果你同时需要控制分箱步长和分箱总数,可以先根据数据的取值范围手动计算匹配的参数:先获取数据的最小值
min_val和最大值max_val,如果要设置N个分箱,对应的步长应为(max_val - min_val)/N,此时两个参数同时传入不会发生冲突。
内容的提问来源于stack exchange,提问作者Piotr Nowakowski
相关产品推荐
相关产品推荐

