我经常制作带有酒吧图的注释(geom_text)。通常,我更喜欢这些值右对齐(与将标签放在柱顶相反)。在绘制分面条形图时,我将这些值放置在每个组中的最大值上(我之前计算出),再加上一点额外的空间,通过乘以x值来添加(我不使用nudge_x,因为它的绝对值可能适用于某些方面,而不适用于其他方面)。
这种方法让我困扰的是注释下方仍然存在轴标签。请参见下面的图像(轴标签15、100和2.5)。我想将x轴标签限制为每个分面中最大的值,而不要一直延伸到注释处。
我想知道是否有更好的方法可用。
(我知道我可以使用group_split和例如patchwork来生成所需的图形。我在这里的兴趣在于是否有一种直接的方式来限制每个单独方面的轴限制/标签)。
非常感谢。
应用于我的(修改后的)示例,这将产生我一直在寻找的结果(见下图)。
这种方法让我困扰的是注释下方仍然存在轴标签。请参见下面的图像(轴标签15、100和2.5)。我想将x轴标签限制为每个分面中最大的值,而不要一直延伸到注释处。
我想知道是否有更好的方法可用。
(我知道我可以使用group_split和例如patchwork来生成所需的图形。我在这里的兴趣在于是否有一种直接的方式来限制每个单独方面的轴限制/标签)。
非常感谢。
library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.6.2
#> Warning: package 'forcats' was built under R version 3.6.3
mtcars %>%
group_by(cyl, gear) %>%
summarise(n_obs=n()) %>%
mutate(n_obs=case_when(gear==4 ~ n_obs*100,
TRUE ~ as.numeric(n_obs))) %>%
group_by(gear) %>%
mutate(n_obs_max=max(n_obs, na.rm=T)) %>%
ggplot()+
geom_bar(aes(y=cyl,
x=n_obs),
stat="identity")+
geom_text(aes(y=cyl,
x=n_obs_max*1.20,
label=n_obs))+
facet_wrap(vars(gear),
scales="free_x")
本文创建于2020年3月8日,使用reprex包 (v0.3.0)
更新
在@stafan的有益回答后进行跟进,这里对我的问题进行了修改和部分回答。
传递给breaks参数的函数
my_breaks <- function(x) {
#calculates the max value on the x axis for each facet
new_x=max(x)
#adjusts this max value for a) the extension of the x axis by the
#expand=expansion(mult=c(0, 0.3)) which was needed to have enough space
#for the annotation; and the factor added to the position of the
#annotations with x=max_n_obs*1.10; the result is the maximum value
#of the bars in each facet;
old_max <- new_x/1.3/1.1
#create 5 labels; the maximum is the highest bar in each facet
my_pretty=labeling::extended(0, old_max, m=5)
#round these values
my_pretty=signif(my_pretty, digits=-2)
#remove the highest label(s)
my_pretty=head(unique(my_pretty), -1)
#combine the remaining labels and the maximum value of the highest bar
my_pretty=c(my_pretty, old_max)
my_pretty
}
应用于我的(修改后的)示例,这将产生我一直在寻找的结果(见下图)。
library(tidyverse)
#> Warning: package 'dplyr' was built under R version 3.6.2
#> Warning: package 'forcats' was built under R version 3.6.3
my_breaks <- function(x) {
new_x=max(x)
old_max <- new_x/1.2/1.05
#old_max
my_pretty=labeling::extended(0, old_max, m=5)
my_pretty=signif(my_pretty, digits=-2)
my_pretty=head(unique(my_pretty), -1)
my_pretty=c(my_pretty, old_max)
my_pretty
}
mtcars %>%
group_by(cyl, gear) %>%
summarise(n_obs=n()) %>%
mutate(n_obs=case_when(gear==4 ~ n_obs*100,
TRUE ~ as.numeric(n_obs))) %>%
group_by(gear) %>%
mutate(n_obs_max=max(n_obs, na.rm=T)) %>%
ggplot()+
geom_bar(aes(y=cyl,
x=n_obs),
stat="identity")+
geom_text(aes(y=cyl,
x=n_obs_max*1.20,
label=n_obs))+
scale_x_continuous(breaks=my_breaks1,
expand=expansion(mult=c(0, 0.05)))+
facet_wrap(vars(gear),
scales="free_x")
scale_x_continuous(breaks=my_breaks(expansion=1.3, pos.factor=1.1))
很遗憾,我还没有弄清楚这是如何工作的。
由reprex package (v0.3.0)在2020-03-09创建
facet_
来完成。也许这个so post有一些替代性的想法? - dario