我尝试了以下代码,但我不想将标签显示在中间,而是将其指向最左侧(您可以在下面看到我的图片)。感谢您的帮助!
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创建
答案 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)
我添加的一些可选操作是关闭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