Невозможно правильно добавить метки в список графиков ggplot - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь собрать многопанельный боксплот с помощью ggplot. Чтобы иметь общую структуру, я создаю список графиков и строю их. Я также хочу добавить письма, сообщающие о значимости групп для каждого коробочного графика. Все работает нормально, за исключением того факта, что на всех боксплотах показаны буквы, вычисленные во время последней итерации цикла.

Ниже приведен пример, в котором я просто пытаюсь добавить буквы, сообщающие номер итерации цикла, икак вы можете видеть вместо сообщения «График 1» для первого цикла и «График 2» для второго, он всегда отображает второй.

Plot with wrong letters

Я использовал следующий код:

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 блоков.

1 Ответ

1 голос
/ 14 октября 2019

Я не совсем уверен, что не так с 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))
}

example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...