如何让这个标签指向最左边的栏?

How do I get this label to point to the leftmost bar?

我尝试了以下代码,但我不想在中间显示标签,而是想将它指向最左边(您可以在下面看到我的图片)。感谢您的帮助!

library(tidyverse)
library(ggrepel)

mtcars %>% 
  group_by(am, cyl) %>% 
  slice(1) %>% 
  ggplot(aes(x = am, y = mpg, group = cyl, fill = cyl, label = mpg)) + 
  geom_bar(position = "dodge", stat = "identity") +
  geom_label_repel(data = mtcars %>% filter(am == 0, 
                                            cyl == 4) %>% 
                     slice(1),
                   nudge_x = 0.2,
                   nudge_y = 0.3,
                   aes(fill = NULL))

reprex package (v0.2.1)

创建于 2019-01-22

一种方法是改用 geom_text。你没有得到标签周围的白色背景,但你可以准确定位它:

mtcars %>% 
 group_by(am, cyl) %>% 
 slice(1) %>% 
 ggplot(aes(x = am, y = mpg, group = cyl, fill = cyl, label = mpg)) + 
 geom_bar(position = "dodge", stat = "identity") +
 geom_text(data = mtcars %>% filter(am == 0,cyl == 4) %>% slice(1),
           nudge_x = -0.3,
           nudge_y = 0.7,
           aes(fill = NULL))

编辑:

正如指出的那样,geom_label 将制作白色背景,这是一个更好的选择 :P

此解决方案通常适用于任何标签组合。

首先,am 变量似乎是一个二元因子,所以我将其编码为一个因子,以便 x 轴更清晰一些。在您的情况下,您正在寻找 position_dodge(width = 1) 作为标签,它会自动将标签排列在相应栏的顶部。我认为最好的方法是仅子集化为您想要的一个标签,我们定义一列 mpg_lab,该列对于您不想要的所有标签都是 NA。如果您更改最后 mutate 行中的条件,您可以隔离不同的标签,或者为所有标签一起删除该行。

df <- mtcars %>% 
  mutate(am = factor(am)) %>% 
  group_by(am, cyl) %>% 
  slice(1) %>% 
  mutate(mpg_lab = ifelse(am == 0 & cyl == 4, mpg, NA))

df %>% 
  ggplot(aes(x = am, y = mpg, group = cyl, fill = cyl)) + 
  geom_bar(position = "dodge", stat = "identity") + 
  geom_label_repel(data = df, 
             aes(label = mpg_lab, fill = NULL), position = position_dodge(width = 1), point.padding = NA, ylim = max(df$mpg_lab, na.rm = T) * 1.02)

我添加的一些可选内容是在 geom_label_repel 中关闭 point.padding 以防止标签随机左右移动。我还提高了标签,这样您就可以通过使用其中的 ylim 参数看到箭头。如果您想要不同的东西,可以尝试这些选项。