ggplot:如何在不同的箱形图中的不同位置注释不同的字符串

时间:2019-07-04 13:32:38

标签: r ggplot2

在R中,我使用ggplot boxplot从两个分别称为 ASD TD 的数据框中绘制数据。

每个数据框报告3个变量:

  • 一个(数字)
  • b(数字)
  • 条件(类别,可以是“ ASD”或“ TD”)

enter image description here enter image description here

我成功创建了两个图;在每张图中,我从两个数据帧并排绘制了相同的变量,分别是 a b ,以便进行比较。然后,我在每个图中添加给定的字符串,即“ Jonh”和“ Jerry”。两个字符串都使用 annotate 打印在y = 35。

问题:如何更改每个字符串的y位置?在示例中,我想在y = 10

处打印字符串“ Jerry”(在变量 b 的图中)

enter image description here

以下是我使用的代码:

#clearing variable and console
cat("\014")
rm(list = ls())
message("Graphic test for boxplot")

#libraries
library(ggplot2)
library(reshape2)

# creation of dataframe ASD, with numeric variables 'a' and 'b',
# and a categorial variable 'condition' with fixed value 'ASD' 
a <- c(1:10)
b <- c(26:35)
ASD <- cbind(a,b)
ASD.df <-as.data.frame(ASD)
ASD.df$condition <- "ASD"

# creation of dataframe TD, with numeric variables 'a' and 'b',
# and a categorial variable 'condition' with fixed value 'TD' 
a <- c(6:15)
b <- c(24:33)
TD <- cbind(a,b)
TD.df <-as.data.frame(TD)
TD.df$condition <- "TD"


# union of ASD and TD in a single dataframe C
C.df <- rbind(ASD.df,TD.df)

# reshaping of C for ggplot, using variable 'condition'
C.df_melted <- melt(C.df, id.var = "condition")


#strings I want to visualise on each graph
myStr <- c("John", "Jerry")

#do I want a fixed y lim?
FIXED_Y_LIM <- TRUE

myBox <- ggplot(data=C.df_melted, aes(x=condition, y=value, fill=variable))+
geom_boxplot(show.legend = FALSE) +
facet_wrap(~variable, scale="free") + 
annotate(geom="text", x=1.5, y=35, label= myStr)

# it forces y scale in this range
if(FIXED_Y_LIM==TRUE)
{
  myBox <- myBox + ylim(0, 40)  
}

myBox

我试图解决修改注释行的问题

annotate(geom="text", x=1.5, y=35, label= myStr)

annotate(geom="text", x=1.5, y=c(35, 10), label= myStr)

但是我收到了我不理解的错误:

错误:美学的长度必须为1或与数据(4)相同:标签

感谢您的建议。

2 个答案:

答案 0 :(得分:1)

使用Annotating text on individual facet in ggplot2,将职位和每个标签添加到C.df_melted。我们使用annotate代替geom_text

C.df_melted$x <- rep(1.5, nrow(C.df_melted))
C.df_melted$y <- c(rep(35, nrow(C.df_melted)/2), rep(10, nrow(C.df_melted)/2))
C.df_melted$myStr <- c(rep("John", nrow(C.df_melted)/2), rep("Jerry", nrow(C.df_melted)/2))

myBox <- ggplot(data=C.df_melted, aes(x=condition, y=value, fill=variable))+
geom_boxplot(show.legend = FALSE) +
facet_wrap(~variable, scale="free") + 
geom_text(mapping = aes(x = x, y = y, label = myStr))

答案 1 :(得分:1)

它是指C.df_melted data.frame中向量的数量。

另一种 用于在labeller上使用facet_wrap()

ggplot(data=C.df_melted, aes(x=condition, y=value, fill=variable)) +
geom_boxplot(show.legend = FALSE) +
facet_wrap(~variable, scale="free", labeller=as_labeller(setNames(myStr, c("a", "b"))))

或者借助Annotating text on individual facet in ggplot2geom_text()更直接地回答您的问题:

ggplot(data=C.df_melted, aes(x=condition, y=value, fill=variable)) +
geom_boxplot(show.legend = FALSE) +
facet_wrap(~variable, scale="free") +
geom_text(data=data.frame(label=myStr, y=c(35, 10), variable=c("a", "b")), mapping=aes(x=1.5, y=y, label=label))