如何添加标签并避免相互覆盖

问题描述 投票:0回答:1

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")
r ggplot2 facet-wrap
1个回答
0
投票

正如我在评论中已经提到的,问题是您使用

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")

© www.soinside.com 2019 - 2024. All rights reserved.