Сгруппированный коробочный сюжет - PullRequest
1 голос
/ 14 апреля 2020

Вот как это выглядит после этих правок - строки, но без полей. new image

Воспроизводимый код:

df <- data.frame(SampleID = structure(c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), 
                                      .Label = c("C004", "C005", "C007", "C009", "C010", 
                                                 "C011", "C013", "C027", "C028", "C029", 
                                                 "C030", "C031", "C032", "C033", "C034", 
                                                 "C035", "C036", "C042", "C043", "C044", 
                                                 "C045", "C046", "C047", "C048", "C049", 
                                                 "C058", "C086"), class = "factor"), 
                 Sequencing.Depth = c(1L, 2612L, 5223L, 7834L, 10445L, 13056L, 15667L, 18278L, 
                                      20889L, 23500L), 
                 Observed.OTUs = c(1, 213, 289.5, 338, 377.8, 408.9, 434.4, 453.8, 472.1, NA), 
                 Mange = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 
                                   .Label = c("N", "Y"), class = "factor"), 
                 SpeciesCode = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), 
                                         .Label = c("Cla", "Ucin", "Vvu"), class = "factor"))

1 Ответ

2 голосов
/ 14 апреля 2020

В вашем aes вы можете использовать interaction ваших значений x и ваших категориальных значений для построения прямоугольника на непрерывной оси x и передать position = "identity", чтобы поместить их в точные значения x, а не увернулся.

Здесь, чтобы добавить строку, соединяющую каждый блок-график, я вычисляю среднее значение для каждого вида на x значений, используя dplyr непосредственно в ggplot, но вы можете вычислить снаружи и сгенерировать второй кадр данных.

Так поскольку ваши значения x довольно сильно разбросаны от 1 до 23500, вам придется изменить width из geom_boxplot, чтобы увидеть поле, а не одну строку:

library(ggplot2)
library(dplyr)

ggplot(df,aes(x = Xvalues, y = Yvalues, color = Species, 
              group = interaction(Species, Xvalues)))+
  geom_boxplot(position = "identity", width = 1000)+
  geom_line(data = df %>% 
              group_by(Xvalues, Species) %>% 
              summarise(Mean = mean(Yvalues)),
            aes(x = Xvalues, y = Mean, 
                color = Species, group = Species))

enter image description here

Итак, примените к своему набору данных (основываясь на информации, предоставленной вами в вашем коде), вы должны попробовать что-то вроде:

library(ggplot2)
library(dplyr)

ggplot(observedotusrare, 
       aes(x=Sequencing.Depth, y=Observed.OTUs, 
                             color=SpeciesCode,
           group = interaction(Sequencing.Depth, SpeciesCode))) + 
  geom_boxplot(position = "identity", width = 1000) + 
  geom_line(data = observedotusrare %>% 
              group_by(Sequencing.Depth, SpeciesCode) %>%
              summarise(Mean = mean(Observed.OTUs, na.rm = TRUE)),
            aes(x = Sequencing.Depth, y = Mean, 
                color = SpeciesCode, group = SpeciesCode))

Отвечает ли он на ваш вопрос ?


Воспроизводимый пример

df <- data.frame(Xvalues = rep(c(10,2000,23500), each = 30),
                 Species = rep(rep(LETTERS[1:3], each = 10),3),
                 Yvalues = c(rnorm(10,1,1),
                             rnorm(10,5,1),
                             rnorm(10,8,1),
                             rnorm(10,5,1),
                             rnorm(10,8,1),
                             rnorm(10,12,1),
                             rnorm(10,20,1),
                             rnorm(10,30,1),
                             rnorm(10,50,1)))
...