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