如何在ggplot2中增加条形图中条形之间的间距?
fae0ux8s1#
您可以随时使用width参数,如下所示:
width
df <- data.frame(x=factor(LETTERS[1:4]), y=sample(1:100, 4)) library(ggplot2) ggplot(data=df, aes(x=x, y=y, width=.5)) + geom_bar(stat="identity", position="identity") + opts(title="width = .5") + labs(x="", y="") + theme_bw()
请与width的以下其他设置进行比较:
到目前为止,一切顺利。现在,假设我们有两个因素。如果你想使用均匀间隔的并置条(比如在barplot()中使用space和beside=TRUE),使用geom_bar(position="dodge")就不那么容易了:你可以改变条形图的宽度,但不能在相邻的条形图之间增加间距(我在Google上没有找到方便的解决方案)。最后我得到了这样的结果:
barplot()
space
beside=TRUE
geom_bar(position="dodge")
df <- data.frame(g=gl(2, 1, labels=letters[1:2]), y=sample(1:100, 4)) x.seq <- c(1,2,4,5) ggplot(data=transform(df, x=x.seq), aes(x=x, y=y, width=.85)) + geom_bar(stat="identity", aes(fill=g)) + labs(x="", y="") + scale_x_discrete(breaks = NA) + geom_text(aes(x=c(sum(x.seq[1:2])/2, sum(x.seq[3:4])/2), y=0, label=c("X","Y")), vjust=1.2, size=8)
用于$x$-axis的向量被“注入”到data.frame中,因此如果需要,可以更改外部间距,而width允许控制内部间距。$x$-axis的标签可以通过使用scale_x_discrete()来增强。
scale_x_discrete()
x8diyxa72#
对于因子条之间的空间,使用
ggplot(data = d, aes(x=X, y=Y, fill=F)) + geom_bar(width = 0.8, position = position_dodge(width = 0.9))
geom_bar中的width控制条相对于x轴的宽度,而position_dodge中的width控制两个条相对于x轴的空间宽度。玩周围的宽度找到一个你喜欢的。
w6mmgewl3#
非常感谢chl!我也有同样的问题,你帮我解决了。我没有使用geom_text来添加X标签,而是使用了scale_x_continuous(见下文)
geom_text(aes(x=c(sum(x.seq[1:2])/2, sum(x.seq[3:4])/2), y=0, label=c("X","Y")), vjust=1.2, size=8)
改为
scale_x_continuous(breaks=c(mean(x.seq[1:2]), mean(x.seq[3:4])), labels=c("X", "Y"))
wgeznvg74#
对于POSIXlt条之间的空间,您需要根据一天中的秒数调整宽度
# POSIXlt example: full & half width d <- data.frame(dates = strptime(paste(2016, "01", 1:10, sep = "-"), "%Y-%m-%d"), values = 1:10) ggplot(d, aes(dates, values)) + geom_bar(stat = "identity", width = 60*60*24) ggplot(d, aes(dates, values)) + geom_bar(stat = "identity", width = 60*60*24*0.5)
cnjp1d6j5#
从ggplot 3.0.0开始,您可以使用position_dodge2。它接受一个padding参数,该参数在条形之间添加空间。
position_dodge2
padding
library(ggplot2) # version >= 3.0.0 set.seed(1530676800) # tib <- tibble( group=rep(LETTERS[1:4], each=3), subgroup=rep(letters[24:26], 4), y=sample(1:100, 4*3) ) ggplot(tib, aes(x=group, fill=subgroup, y=y)) + geom_col(position=position_dodge2())
默认填充为0.1。因为我知道你想看到不同的填充选项:
library(purrr) library(cowplot) theme_set(theme_cowplot()) n_col <- 2 bottom_row_starts <- 3 plots0 <- purrr::imap(0.1*c(1:4), \(pad, idx) { ret <- ggplot(tib, aes(x=group, fill=subgroup, y=y)) + geom_col(position=position_dodge2(padding=pad)) + labs(subtitle=paste0("Padding = ", pad)) #+ #theme(plot.margin = margin(6, 0, 6, 0)) if (bottom_row_starts > idx) { ret <- ret + xlab(NULL) } if(1 != (idx %% n_col)) { ret <- ret + ylab(NULL) } return(ret) }) leg <- cowplot::get_legend(plots0[[1]]) plots <- plots0 %>% purrr::map(\(pp) { pp + theme(legend.position="none") }) cowplot::plot_grid( plotlist=plots, ncol=n_col ) %>% cowplot::plot_grid( leg, rel_widths = c(4, 1) )
5条答案
按热度按时间fae0ux8s1#
您可以随时使用
width
参数,如下所示:请与
width
的以下其他设置进行比较:到目前为止,一切顺利。现在,假设我们有两个因素。如果你想使用均匀间隔的并置条(比如在
barplot()
中使用space
和beside=TRUE
),使用geom_bar(position="dodge")
就不那么容易了:你可以改变条形图的宽度,但不能在相邻的条形图之间增加间距(我在Google上没有找到方便的解决方案)。最后我得到了这样的结果:用于$x$-axis的向量被“注入”到data.frame中,因此如果需要,可以更改外部间距,而
width
允许控制内部间距。$x$-axis的标签可以通过使用scale_x_discrete()
来增强。x8diyxa72#
对于因子条之间的空间,使用
geom_bar中的width控制条相对于x轴的宽度,而position_dodge中的width控制两个条相对于x轴的空间宽度。玩周围的宽度找到一个你喜欢的。
w6mmgewl3#
非常感谢chl!我也有同样的问题,你帮我解决了。我没有使用geom_text来添加X标签,而是使用了scale_x_continuous(见下文)
改为
wgeznvg74#
对于POSIXlt条之间的空间,您需要根据一天中的秒数调整宽度
cnjp1d6j5#
从ggplot 3.0.0开始,您可以使用
position_dodge2
。它接受一个padding
参数,该参数在条形之间添加空间。默认填充为0.1。因为我知道你想看到不同的填充选项: