如何在ggplot的dodged histogram分箱间添加间距?
如何在ggplot的并列直方图分箱间添加间距
你遇到的问题其实是用geom_histogram搭配position = "dodge"时,默认设置下同个分箱内的条形会挤在一起,分箱之间也没有明显间距。这里有两个实用的解决方法,我给你详细拆解下:
方法一:用position_dodge()手动控制间距
直接把position = "dodge"替换成position = position_dodge(width = ...)就行,这个width参数需要和你的分箱宽度匹配。你的分箱是按seq(10000, 20000, 2500)设置的,分箱宽度是2500,所以可以把width设为小于2500的数值(比如2000),这样同组条形会分开,分箱之间的空隙也会更清晰。
修改后的完整代码:
library(ggplot2) # 注意这里是ggplot2不是ggplot哦 library(tidyverse) diamonds %>% filter(clarity %in% c("VS2", "VS1", "VVS2", "VVS1")) %>% ggplot() + geom_histogram( aes(x = price, fill = clarity), breaks = seq(10000, 20000, 2500), color = "black", position = position_dodge(width = 2000) # 自定义间距大小 )
你可以根据视觉效果调整width的数值,数值越小,同组条形间的间距越大,分箱之间的空隙也会更明显。
方法二:先统计数据再用geom_col()绘制
另一种更灵活的思路是先手动计算每个分箱和clarity组合的频数,再用geom_col()来绘制,这样对间距的控制会更精准:
- 用
cut()把price划分到对应的区间 - 统计每个区间+clarity组合的计数
- 用
geom_col()搭配position_dodge()设置间距
代码示例:
library(ggplot2) library(tidyverse) diamonds %>% filter(clarity %in% c("VS2", "VS1", "VVS2", "VVS1")) %>% mutate(price_bin = cut(price, breaks = seq(10000, 20000, 2500))) %>% count(price_bin, clarity) %>% ggplot(aes(x = price_bin, y = n, fill = clarity)) + geom_col(position = position_dodge(width = 0.8), color = "black") + xlab("Price")
这里position_dodge(width = 0.8)是相对于x轴每个分类的默认宽度(默认值为1),0.8的设置会让同组条形之间保留小间距,同时不同分箱的间隔也很清晰。
两种方法都能解决你的问题,第一种更直接,第二种更灵活,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者JohnDoeVsJoeSchmoe
相关产品推荐
相关产品推荐

