plotnine中geom_histogram分箱位置错误,如何精确设置宽度为10的分箱?
plotnine中geom_histogram分箱位置错误,如何精确设置宽度为10的分箱?
我明白你想要的是完全精确的10宽度分箱,不想让plotnine自动调整分箱导致位置偏移或者宽度不准对吧?其实解决这个问题很简单,有两种实用的方法,结合你的代码给你演示下:
方法一:手动指定分箱边界(最精确可控)
直接构造一个包含所有分箱起始和结束值的列表,让每个分箱的宽度严格为10。比如你的数据范围是0-99,我们可以生成从0到100、步长为10的边界列表:
import plotnine as p9 import pandas as pd # 你的原始数据生成代码 rand_numbers = ([0]*5 + [9]*5) + \ ([50]*20 + [59]*30) + \ ([60]*30 + [69]*30) + \ ([70]*35 + [79]*35) + \ ([80]*40 + [89]*40) + \ ([90]*45 + [99]*45) df = pd.DataFrame({ 'c1': rand_numbers, 'c2': ['foo'] * 120 + ['bar'] * 70 + ['baz']*170 }) # 手动构造分箱边界,确保每个分箱宽度为10 custom_bins = list(range(0, 101, 10)) # 生成[0,10,20,...,100] # 绘制直方图 p = (p9.ggplot(df, p9.aes(x='c1', fill='c2')) + p9.geom_histogram(bins=custom_bins, alpha=0.7) # 传入自定义边界 + p9.labs(title='精确宽度10的分箱直方图', x='数值', y='频数') + p9.theme_minimal()) print(p)
这种方式完全由你掌控分箱的区间,比如0-10、10-20...90-100,每个分箱宽度正好是10,完美匹配你数据里的分组逻辑。
方法二:用binwidth+boundary参数快速对齐
如果你不想手动写所有边界,可以用binwidth=10指定分箱宽度,再加上boundary参数指定分箱的对齐起点(比如0),这样plotnine会从你指定的起点开始,自动生成宽度为10的分箱:
p = (p9.ggplot(df, p9.aes(x='c1', fill='c2')) + p9.geom_histogram(binwidth=10, boundary=0, alpha=0.7) + p9.labs(title='精确宽度10的分箱直方图', x='数值', y='频数') + p9.theme_minimal()) print(p)
这里的boundary=0是关键,它让分箱的边界对齐到0,确保第一个分箱是0-10,第二个是10-20,以此类推,不会出现比如5-15这种偏移的分箱,完美贴合你数据里的整十数分组。
需要注意的是,plotnine的分箱默认是左闭右开的区间,比如[0,10)会包含0但不包含10,这正好匹配你数据里的0-9、50-59这类数值范围。
备注:内容来源于stack exchange,提问作者vaulttech
相关产品推荐
相关产品推荐

