无法正确地将标签添加到 ggplot 图列表
Unable to correctly add labels to a list of ggplot graphs
我正在尝试 assemble 使用 ggplot 绘制多面板箱线图。
为了有一个总体结构,我生成了一个图表列表并绘制它们。我还想为每个箱线图添加报告显着性组的字母。
一切正常,除了所有箱线图都显示了在循环的最后一次迭代期间计算的字母。
我在 post 下面的示例中,我只是尝试添加报告循环迭代次数的字母,正如您所看到的,而不是报告第一个循环的 "Plot 1" 和 "Plot 2" 对于第二个,它总是绘制第二个。
我使用的代码如下:
library(ggplot2)
library(gridExtra)
mydata<-data.frame(values=c(1,4,5,6,4,2,4,7,3,4,5,6,4,4,2,1,3,6,4,1,2,5,4,3,4,2,1,3,4,2),group=c(rep("A",15),rep("B",15)))
mydata2<-data.frame(values=c(2,6,5,6,7,2,5,7,3,4,5,6,4,4,2,1,3,6,4,1,2,5,4,3,1,2,3,3,4,7),group=c(rep("A",15),rep("B",15)))
myp<-list()
for(aaa in 1:2)
{
if(aaa==1) mydata<-mydata else mydata<-mydata2
myp[[aaa]]<-ggplot(mydata, aes(x=group, y=values)) +
geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
geom_jitter(position=position_jitter(width=.1, height=0)) +
geom_text(aes(x=1, y=max(values)-0.05*max(values),label=paste("Plot",aaa))) +
geom_text(aes(x=2, y=max(values)-0.05*max(values),label=paste("Plot",aaa)))
}
do.call(grid.arrange,myp)
我做错了什么?看起来 do.call 与 grid.arrange 的使用会导致 geom_text 出现问题(但不会出现情节,这在两个循环中是不同的)。
我宁愿不手动编写所有绘图函数,因为我至少有三个多面板图,每个图都有 4 个箱线图。
我不完全确定 geom_text
出了什么问题,但是如果您改用 annotate
一切正常(应该完全用于此目的)。
for(aaa in 1:2){
print(aaa)
if(aaa==1) df<-mydata else df<-mydata2
myp[[aaa]]<-ggplot(df, aes(x=group, y=values)) +
geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
geom_jitter(position=position_jitter(width=.1, height=0)) +
annotate("text", x=1, y=max(df$values)-0.05*max(df$values),label=paste("Plot",aaa)) +
annotate("text", x=2, y=max(df$values)-0.05*max(df$values),label=paste("Plot",aaa))
}
我正在尝试 assemble 使用 ggplot 绘制多面板箱线图。 为了有一个总体结构,我生成了一个图表列表并绘制它们。我还想为每个箱线图添加报告显着性组的字母。 一切正常,除了所有箱线图都显示了在循环的最后一次迭代期间计算的字母。
我在 post 下面的示例中,我只是尝试添加报告循环迭代次数的字母,正如您所看到的,而不是报告第一个循环的 "Plot 1" 和 "Plot 2" 对于第二个,它总是绘制第二个。
我使用的代码如下:
library(ggplot2)
library(gridExtra)
mydata<-data.frame(values=c(1,4,5,6,4,2,4,7,3,4,5,6,4,4,2,1,3,6,4,1,2,5,4,3,4,2,1,3,4,2),group=c(rep("A",15),rep("B",15)))
mydata2<-data.frame(values=c(2,6,5,6,7,2,5,7,3,4,5,6,4,4,2,1,3,6,4,1,2,5,4,3,1,2,3,3,4,7),group=c(rep("A",15),rep("B",15)))
myp<-list()
for(aaa in 1:2)
{
if(aaa==1) mydata<-mydata else mydata<-mydata2
myp[[aaa]]<-ggplot(mydata, aes(x=group, y=values)) +
geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
geom_jitter(position=position_jitter(width=.1, height=0)) +
geom_text(aes(x=1, y=max(values)-0.05*max(values),label=paste("Plot",aaa))) +
geom_text(aes(x=2, y=max(values)-0.05*max(values),label=paste("Plot",aaa)))
}
do.call(grid.arrange,myp)
我做错了什么?看起来 do.call 与 grid.arrange 的使用会导致 geom_text 出现问题(但不会出现情节,这在两个循环中是不同的)。 我宁愿不手动编写所有绘图函数,因为我至少有三个多面板图,每个图都有 4 个箱线图。
我不完全确定 geom_text
出了什么问题,但是如果您改用 annotate
一切正常(应该完全用于此目的)。
for(aaa in 1:2){
print(aaa)
if(aaa==1) df<-mydata else df<-mydata2
myp[[aaa]]<-ggplot(df, aes(x=group, y=values)) +
geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
geom_jitter(position=position_jitter(width=.1, height=0)) +
annotate("text", x=1, y=max(df$values)-0.05*max(df$values),label=paste("Plot",aaa)) +
annotate("text", x=2, y=max(df$values)-0.05*max(df$values),label=paste("Plot",aaa))
}