在ggplot2中,如何在facet_wrap中按组添加文本?

时间:2016-03-10 16:45:51

标签: r ggplot2

以下是一个例子:

library(ggplot2)
set.seed(112)
df<-data.frame(g=sample(c("A", "B"), 100, T),
           x=rnorm(100),
           y=rnorm(100,2,3),
           f=sample(c("i","ii"), 100, T))
ggplot(df, aes(x=x,y=y, colour=factor(g)))+
geom_point()+geom_smooth(method="lm", fill="NA")+facet_wrap(~f)

我的问题是如何按照第二组的情节添加文字进入情节。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:3)

您可以手动为文本创建另一个data.frame,并在原始图上添加图层。

df_text <- data.frame(g=rep(c("A", "B")), x=-2, y=c(9, 8, 9, 8),
                      f=rep(c("i", "ii"), each=2),
                      text=c("R=0.2", "R=-0.3", "R=-0.05", "R=0.2"))

ggplot(df, aes(x=x,y=y, colour=factor(g))) +
  geom_point() + geom_smooth(method="lm", fill="NA") +
  geom_text(data=df_text, aes(x=x, y=y, color=factor(g), label=text),
  fontface="bold", hjust=0, size=5, show.legend=FALSE) + 
  facet_wrap(~f)

enter image description here

答案 1 :(得分:3)

另一种选择是动态计算相关性并使用因子变量g的基础数值来放置文本,以便红色和蓝色标签不重叠。这减少了所需的代码量,使标签放置更容易。

library(dplyr)

ggplot(df, aes(x=x, y=y, colour=g)) +
  geom_point() + 
  geom_smooth(method="lm", fill=NA) +  # Guessing you meant fill=NA here
  #geom_smooth(method="lm", se=FALSE)  # Better way to remove confidence bands
  facet_wrap(~f) +
  geom_text(data=df %>% group_by(g, f) %>% summarise(corr = cor(x,y)), 
            aes(label=paste0("R = ", round(corr,2)), y = 10 - as.numeric(g)), 
            x=-2, hjust=0, fontface="bold", size=5, show.legend=FALSE)

enter image description here