如何使该标签指向最左边的栏?

时间:2019-01-22 23:14:50

标签: r ggplot2 ggrepel

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

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创建

2 个答案:

答案 0 :(得分:4)

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

首先,似乎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)

enter image description here

我添加的一些可选操作是关闭point.padding中的geom_label_repel,以防止标签随机地左右移动。我也将标签抬高了,这样您就可以在其中使用ylim参数来看到箭头。如果您希望有所不同,可以尝试使用这些选项。

答案 1 :(得分:2)

一种方法是改用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