Последовательные надписи через грани для письма Tukey на ggplot - PullRequest
0 голосов
/ 14 мая 2019

Я следовал за ответом на этот вопрос: Результаты теста Tukey на geom_boxplot с facet_grid

Это замечательно, но я хотел бы также сравнить аспекты между ними. Другими словами, сначала упорядочите все результаты по буквам, а затем разделите их на фасеты (у меня есть как горизонтальные, так и вертикальные фасеты). Как я могу это сделать? Кроме того, как я могу изменить порядок букв, начиная с «a» в первой переменной в первом фасете, а затем «b» во второй переменной и так далее? Я попробовал следующее, и это не сработало, поскольку я хочу это для заказа.

TUKEY <- TukeyHSD(ANOVA, ordered = TRUE)

Вот воспроизводимый код (код для создания графиков взят по ссылке выше), а данные взяты по этой ссылке (http://sape.inf.usi.ch/quick-reference/ggplot2/facet)

d=expand.grid(obs=0:10, benchmark=c('antlr', 'bloat', 'chart'), gc=c('CopyMS', 'GenCopy', 'GenImmix'), opt=c('on', 'off', 'valid'), heapSize=seq(from=1.5, to=4, by=0.5))
d$time = rexp(nrow(d), 0.01)+1000
d$time = d$time + abs(d$heapSize-3)*100
d$time[d$opt=='on'] = d$time[d$opt=='on']-200

d$time[d$opt=='on' & d$benchmark=='bloat'] = d$time[d$opt=='on' & d$benchmark=='bloat'] + 190

generate_label_df <- function(TUKEY, variable){

  # Extract labels and factor levels from Tukey post-hoc 
  Tukey.levels <- variable[,4]
  Tukey.labels <- data.frame(multcompLetters(Tukey.levels)['Letters'])

  #I need to put the labels in the same order as in the boxplot :
  Tukey.labels$treatment=rownames(Tukey.labels)
  Tukey.labels=Tukey.labels[order(Tukey.labels$treatment) , ]
  return(Tukey.labels)
}


TUKEYplot <- function(df){

  p<-ggplot(data=df)+
    aes(x = opt, y = time, colour = opt) +
    geom_boxplot() +
    facet_grid(gc~benchmark) +
    theme_linedraw() +
    theme(axis.text.x=element_text(angle=45, hjust=1)) +
    ylim(min(df$time),max(df$time)+0.05) +
    labs(x = "type", y= "time", color = "state") +
    theme(strip.background = element_rect(colour = "black", fill = "white")) +
    theme(strip.text = element_text(colour = "black", size=12)) +
    theme(axis.text=element_text(size=12)) +
    theme(legend.text=element_text(size=12)) +
    theme(legend.title=element_text(size=12,face="bold")) +
    theme(axis.title=element_text(size=14,face="bold")) +
    scale_color_npg()
  for (facetk2 in as.character(unique(df$gc))) {   
    for (facetk in as.character(unique(df$benchmark))) {   
      subdf <- subset(df, df$benchmark==facetk & df$gc==facetk2)
      model=lm(time ~ opt, data=subdf)
      ANOVA=aov(model)
      # Tukey test to study each pair of treatment :
      TUKEY <- TukeyHSD(ANOVA)
      print(TUKEY)
      labels <- generate_label_df(TUKEY , TUKEY$`opt`)
      names(labels) <- c('Letters', 'opt')
      yvalue <- aggregate(.~opt, data=subdf, quantile, probs=.75)  
      final <- merge(labels, yvalue)
      final$benchmark <-  facetk
      final$gc <-  facetk2

      p <- p + geom_text(data = final,  aes(x=opt, y=time, label=Letters), 
                         vjust=-1.2, hjust=-.5, show.legend = FALSE, size=5)
    }
  }
  return (p)
}

p1<-TUKEYplot(d)
p1                     



Обновление: Визуальная помощь, которую я хотел бы сделать:

Оригинальный сюжет:

Original

Частично желаемый участок:

Partial update

1 Ответ

0 голосов
/ 20 мая 2019

Я наконец-то понял, как это сделать, поэтому выкладываю ответ! По сути, вытащив вычисления Тьюки из цикла, используя ANOVA для взаимодействия и применив Тьюки после того, как я позволил то, что я хотел сделать. Затем метки разделяются на столбцы (убедитесь, что ваши данные не содержат ":", вы можете использовать переоценку, если она есть), затем они зацикливаются на уровнях данных.

TUKEYplot <- function(df){

  p<-ggplot(data=df)+
    aes(x = opt, y = time, colour = opt) +
    geom_boxplot() +
    facet_grid(gc~benchmark) +
    theme_linedraw() +
    theme(axis.text.x=element_text(angle=45, hjust=1)) +
    ylim(min(df$time),max(df$time)+0.05) +
    labs(x = "type", y= "time", color = "state") +
    theme(strip.background = element_rect(colour = "black", fill = "white")) +
    theme(strip.text = element_text(colour = "black", size=12)) +
    theme(axis.text=element_text(size=12)) +
    theme(legend.text=element_text(size=12)) +
    theme(legend.title=element_text(size=12,face="bold")) +
    theme(axis.title=element_text(size=14,face="bold")) +
    scale_color_npg()

  model=lm(time ~ gc*benchmark*opt, data=df)
  ANOVA=aov(model)
  # Tukey test to study each pair of treatment :
  TUKEY <- TukeyHSD(ANOVA)
  all_labels <- generate_label_df(TUKEY , TUKEY$`gc:benchmark:opt`)
  sep_labels<- all_labels %>% separate(col=treatment, into= c("gc", "benchmark", "opt"), sep=":")

  for (facetk2 in as.character(unique(df$gc))) {   
    for (facetk in as.character(unique(df$benchmark))) {   
      subdf <- subset(df, df$benchmark==facetk & df$gc==facetk2)
      labels <- subset(sep_labels, sep_labels$benchmark==facetk & sep_labels$gc==facetk2)
      labels <- subset(labels, select = -c(gc,benchmark))

      names(labels) <- c('Letters', 'opt')
      yvalue <- aggregate(.~opt, data=subdf, quantile, probs=.75)  
      final <- merge(labels, yvalue)
      final$benchmark <-  facetk
      final$gc <-  facetk2

      p <- p + geom_text(data = final,  aes(x=opt, y=time, label=Letters), 
                         vjust=-1.2, hjust=-.5, show.legend = FALSE, size=5)
    }
  }
  return (p)
}

Результирующее изображение: (не удалось вставить изображение, потому что мне не хватает репутации ..)

Результат

...