如何在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)) )
对应的图表:
使用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
相关产品推荐
相关产品推荐

