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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 14:15:26