如何让这个标签指向最左边的栏?
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
参数看到箭头。如果您想要不同的东西,可以尝试这些选项。
我尝试了以下代码,但我不想在中间显示标签,而是想将它指向最左边(您可以在下面看到我的图片)。感谢您的帮助!
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
参数看到箭头。如果您想要不同的东西,可以尝试这些选项。