在facet_wrap的每个构面的各个位置绘制geom_text

时间:2019-01-16 18:24:14

标签: r ggplot2

我有这个数据集

df <- data.frame(groups=factor(c(rep("A",6), rep("B",6), rep("C",6))),
                 types=factor(c(rep(c(rep("Z",2), rep("Y",2), rep("X",2)),3))),
                 values=c(10,11,1,2,0.1, 0.2, 12,13, 2,2.5, 0.2, 0.01, 
                          12,14, 2,3,0.1,0.2))
library(ggplot2)
px <- ggplot(df, aes(groups, values)) + facet_wrap(~types, scale="free") + geom_point()
px

我进行了事后分析(每个类型级别的值〜组),并创建了一个数据集,其中包含重要性组(如字母:a,b,c等):

df.text <- data.frame(groups=factor(c(rep("A",3), rep("B",3), rep("C",3))),
                      label=rep("a", 9))

我继续在px上绘制标签:

px + geom_text(data=df.text, aes(x=groups, y=0.1, label=label), size=4, col="red", stat="identity") +theme_bw()

看起来不太好

我的问题是在aes(y)中定义一个geom_text,该标签将标签绘制在固定位置(例如x轴上方或面板顶部),而不会移动y轴太多。使用以前的数据集,各组之间的y值相当均匀,因此我可以摆脱非常低的y值。但这一次y的范围相当大,因此不易实现。

因此,问题是如何在df.text中的facet_wrap中的固定位置绘制标签,同时保持scale="free"。最好在顶部panel.border上方。

1 个答案:

答案 0 :(得分:2)

您可以定义一个新变量height,该变量确定绘制标签的高度:

library(tidyverse)

df %>% 
  group_by(types) %>% 
  mutate(height = max(values) + .3 * sd(values)) %>% 
  left_join(df.text, by = "groups") %>% 
  ggplot(aes(groups, values)) + 
  facet_wrap(~types, scale = "free") + 
  geom_point() +
  geom_text(aes(x = groups, y = height, label = label), size = 4, col = "red", stat = "identity") +
  theme_bw()

在这里,我使用最大值加上标准偏差的0.3倍,但是您可以将其更改为您想要的任何值。不过,不确定如何在面板条的顶部放置标签。