如何在离散数据分面图中增大X轴刻度间距?
解决ggplot2子图X轴刻度间距过小的问题
问题重现
使用facet_wrap绘制多子图时,X轴离散刻度间距过小导致点重叠,尝试scale_x_discrete(expand=...)和position_dodge均无效。
数据集
testdata <- structure(list(x = c(75, 77, 84, 73, 62, 74, 55, 20, 73, 89, 36, 49, 72, 92, 54, 76, 40, 40, 46, 85, 19, 25, 75, 16, 84, 58, 85, 26, 87, 20, 39, 61, 88, 89, 81, 73, 60, 87, 95, 86), variable = c("Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var1", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2", "Var2"), value = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D" )), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -40L), groups = structure(list(value = c("A", "B", "C", "D"), .rows = structure(list(1:10, 11:20, 21:30, 31:40), ptype = integer(0), class = c("vctrs_list_of", "vctrs_vctr", "list"))), row.names = c(NA, -4L), .drop = TRUE, class = c("tbl_df", "tbl", "data.frame"))
解决方案
要增大子图内X轴刻度的间距,核心是调整子图的宽度(离散X轴的刻度间距由面板宽度决定),可通过以下两种方式实现:
方法1:调整绘图长宽比与面板间距
修改theme()中的aspect.ratio让子图更宽,同时配合facet_wrap的panel.spacing控制子图间距离:
library(ggplot2) library(ggdist) ggplot(testdata, aes(value, x)) + stat_halfeye( adjust = 0.5, justification = -0.15, .width = 0, point_color = NA ) + geom_boxplot( width = 0.12, outlier.color = NA ) + stat_dots( side = "left", justification = 1.15, size = 2, # 适当调大点更易观察,可按需修改 fill = "red" ) + facet_wrap(~variable, scales = "free_x") + theme( aspect.ratio = 0.3, # 减小比值让子图更宽,刻度间距自然增大 panel.spacing = unit(1, "cm") # 可选:调整子图之间的间距 )
方法2:指定facet列数
通过facet_wrap的ncol参数减少列数,让每个子图占据更多宽度:
ggplot(testdata, aes(value, x)) + stat_halfeye( adjust = 0.5, justification = -0.15, .width = 0, point_color = NA ) + geom_boxplot( width = 0.12, outlier.color = NA ) + stat_dots( side = "left", justification = 1.15, size = 2, fill = "red" ) + facet_wrap(~variable, scales = "free_x", ncol = 1) # 单列显示,子图宽度最大化
为什么之前的方法无效?
scale_x_discrete(expand=...)仅作用于X轴刻度的外部扩展空间,不会改变刻度之间的间距;position_dodge用于分组元素的错开显示,而你的X轴是单类别分组,因此无法生效。
内容的提问来源于stack exchange,提问作者Haakonkas
相关产品推荐
相关产品推荐

