在
ggplot2::facet_wrap
中,我想添加标签inc
,代码geom_text(aes(label = scales::percent(inc,0.1)),hjust=2,vjust=12)
可以工作,但是标签相互覆盖。如何调整标签inc
的标签位置?谢谢!
如附图,我想将类别B的标签
75%
删除到红色栏中
library(tidyverse)
plot_data <- data.frame(category=c('A','A','B','B'),
period=c('2022','2023','2022','2023'),
sales=c(10,12,0.2,0.35))
plot_data %>% group_by(category) %>% mutate(inc = sales/lag(sales)-1) %>%
ggplot(aes(x=category,y=sales,fill=period))+geom_col(position=position_dodge(0.8))+
geom_text(aes(label = sales),position = position_dodge2(0.8))+
geom_text(aes(label = scales::percent(inc,0.1)),hjust=2,vjust=12)+
facet_wrap(~ category,scales="free")
正如我在评论中已经提到的,问题是您使用
hjust
和 vjust
来移动标签。这两个参数都旨在指定标签的对齐方式,即使我们偶尔误用它们来添加一些填充,当您想要较大量地移动或微移标签时,还有更好的选择。
但是,恕我直言,在您的情况下,最简单的方法是仅使用一个标签,即
paste
将标签的两个部分放在一起并添加换行符。此外,我只是将标签移动到条形内,并通过 vjust
添加一些填充。
library(tidyverse)
plot_data %>%
group_by(category) %>%
mutate(
inc = lead(sales) / sales - 1,
label = if_else(
!is.na(inc),
paste0(sales, "\n", scales::percent(inc, 0.1)),
paste0(sales, "\n", "")
)
) %>%
ggplot(aes(x = category, y = sales, fill = period)) +
geom_col(position = position_dodge(0.8)) +
geom_text(
aes(
label = label, group = period
),
position = position_dodge(0.8),
vjust = 1.1
) +
facet_wrap(~category, scales = "free")
但是,如果您坚持将
sales
标签垂直居中于栏顶部,那么您也可以对 vjust
进行一些摆弄,例如vjust=.825
似乎可以完成这项工作:
plot_data %>%
group_by(category) %>%
mutate(
inc = lead(sales) / sales - 1,
label = if_else(
!is.na(inc),
paste0(sales, "\n", scales::percent(inc, 0.1)),
paste0(sales, "\n", "")
)
) %>%
ggplot(aes(x = category, y = sales, fill = period)) +
geom_col(position = position_dodge(0.8)) +
geom_text(
aes(
label = label, group = period
),
position = position_dodge(0.8),
vjust = .825
) +
facet_wrap(~category, scales = "free")