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

如何在plotnine中绘制带分面的并列直方图?

如何绘制带分面的并列分组条形图?

我想用plotnine绘制包含分面的并列分组图表,不加分面时直方图显示正常,但没法直观对比Two和Three组的计数。

初始代码(无并列设置)

from plotnine import *
import pandas as pd 
import numpy as np

quality = ['poor', 'fair', 'good', 'very good', 'excellent']
cat1 = np.random.choice(quality,1000)
cat2 = np.random.choice(quality,1000)
cat3 = np.random.choice(quality,1000)

df = pd.DataFrame({
    'One': pd.Categorical([*cat1, *cat1], categories= quality),
    'group': np.repeat(['Two', 'Three'], len(cat1)),
    'cat': pd.Categorical([*cat2, *cat3], categories= quality)
})

(
    ggplot(df, aes(x = 'cat', fill = 'group'))
    + geom_histogram(bins = 5) # , position = 'dodge'
    + facet_grid('One ~ .')
    + theme(figure_size=(6, 6))
)

对应的图表:
无并列设置的分面图表

异常情况:添加position='dodge'后

添加并列参数后,条形变得极窄且与x轴不对齐:

(
    ggplot(df, aes(x = 'cat', fill = 'group'))
    + geom_histogram(bins = 5, position = 'dodge')
    + facet_grid('One ~ .')
    + theme(figure_size=(6, 6))
)

对应的图表:
添加dodge后的异常图表
使用position = position_dodge(.75)也会出现同样问题。


解决方法:替换为geom_bar()

你的x轴是分类变量,geom_histogram()是为连续数据分箱设计的,不适合分类变量的计数对比。改用geom_bar()即可生成正确的并列分组条形图:

(
    ggplot(df, aes(x='cat', fill='group'))
    + geom_bar(position='dodge')  # 无需指定bins,默认统计分类计数
    + facet_grid('One ~ .')
    + theme(figure_size=(6, 8))  # 可调整尺寸优化分面显示
)

补充说明

  • 如果需要调整条形宽度,可在geom_bar()中添加width参数,比如geom_bar(position='dodge', width=0.7),让条形布局更符合需求。
  • 核心原因:geom_histogram()会强制将分类变量转为连续数值分箱,导致position='dodge'的布局逻辑混乱,而geom_bar()天生适配分类变量的分组计数场景。

内容的提问来源于stack exchange,提问作者displayname123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:11:01