3

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

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 包(v0.2.1)于 2019 年 1 月 22 日创建

4

2 回答 2

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)

在此处输入图像描述

我添加的一些可选功能是关闭point.paddinggeom_label_repel防止标签随机左右移动。我还将标签向上撞,因此您可以使用其中的ylim参数看到箭头。如果您想要不同的东西,您可以使用这些选项。

于 2019-01-23T00:35:57.060 回答
1

上路就是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

于 2019-01-22T23:25:32.067 回答