简体   繁体   English

如何绘制时间序列图并在线上放置箱线图?

[英]How to plot time-series plot with box plot laid on the lines?

I have a dataframe called df.我有一个名为 df 的数据框。 I have 10 replicates for each sample.id and using these replicates I want to get the statistics (showing box plots) for the good and bad Location .我为每个sample.id进行了 10 次重复,并使用这些重复我想获得好位置和坏Location的统计信息(显示箱线图)。 The X-axis should have the depth values and the Y axis should have the observed_otus values. X 轴应具有depth值,Y 轴应具有observed_otus值。

I want to get a plot that looks like this我想要一个看起来像这样的情节

df <- structure(list(sample.id = c("s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16", "s1", "s10", "s11", "s13", "s14", 
"s16", "s1", "s10", "s11", "s13", "s14", "s16", "s1", "s10", 
"s11", "s13", "s14", "s16"), Location = c("GOOD", "GOOD", "SALINE", 
"SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", 
"SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", 
"SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", 
"GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", 
"GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", 
"SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", 
"SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", 
"SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", 
"SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", 
"GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", 
"GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", 
"SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", 
"SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", 
"SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", 
"SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", 
"GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", 
"GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", 
"SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", 
"SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", 
"SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", 
"SALINE", "GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", 
"GOOD", "GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", 
"GOOD", "SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", 
"SALINE", "SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", 
"SALINE", "SALINE", "SALINE", "GOOD", "GOOD", "SALINE", "SALINE", 
"SALINE", "SALINE"), depth = c("1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", 
"1", "1", "98", "98", "98", "98", "98", "98", "98", "98", "98", 
"98", "98", "98", "98", "98", "98", "98", "98", "98", "98", "98", 
"98", "98", "98", "98", "98", "98", "98", "98", "98", "98", "98", 
"98", "98", "98", "98", "98", "98", "98", "98", "98", "98", "98", 
"98", "98", "98", "98", "98", "98", "98", "98", "98", "98", "98", 
"98", "98", "98", "98", "98", "98", "98", "196", "196", "196", 
"196", "196", "196", "196", "196", "196", "196", "196", "196", 
"196", "196", "196", "196", "196", "196", "196", "196", "196", 
"196", "196", "196", "196", "196", "196", "196", "196", "196", 
"196", "196", "196", "196", "196", "196", "196", "196", "196", 
"196", "196", "196", "196", "196", "196", "196", "196", "196", 
"196", "196", "196", "196", "196", "196", "196", "196", "196", 
"196", "196", "196"), rep = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 
7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 
10L, 10L, 10L, 10L, 10L, 10L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 
7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 
10L, 10L, 10L, 10L, 10L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 
7L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 
10L, 10L, 10L, 10L), .Label = c("iter.1", "iter.2", "iter.3", 
"iter.4", "iter.5", "iter.6", "iter.7", "iter.8", "iter.9", "iter.10"
), class = "factor"), observed_otus = c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 68L, 58L, 54L, 73L, 61L, 70L, 66L, 52L, 
61L, 71L, 62L, 76L, 74L, 59L, 53L, 73L, 73L, 76L, 70L, 57L, 51L, 
71L, 59L, 70L, 73L, 57L, 57L, 75L, 70L, 63L, 74L, 61L, 56L, 74L, 
66L, 66L, 74L, 56L, 55L, 72L, 60L, 73L, 76L, 55L, 63L, 68L, 64L, 
71L, 79L, 59L, 56L, 72L, 58L, 61L, 73L, 56L, 56L, 70L, 65L, 69L, 
122L, 79L, 82L, 118L, 95L, 117L, 117L, 82L, 82L, 118L, 97L, 100L, 
115L, 86L, 77L, 109L, 96L, 115L, 120L, 76L, 84L, 117L, 102L, 
116L, 110L, 87L, 81L, 117L, 91L, 115L, 121L, 79L, 79L, 127L, 
96L, 114L, 117L, 78L, 86L, 109L, 96L, 114L, 113L, 85L, 70L, 111L, 
100L, 107L, 117L, 86L, 79L, 118L, 104L, 117L, 111L, 75L, 83L, 
110L, 95L, 110L)), row.names = c(NA, -180L), class = "data.frame")

A ggplot -solution to your problem:一个ggplot -解决你的问题:

library(tidyverse)

df <- df %>% mutate_at("depth",factor,unique(sort(as.numeric(.$depth)))) #converting the depth values to factor and order

ggplot(df, aes(x=depth, y=observed_otus,color=Location)) + #initialize ggplot
geom_boxplot(position="identity") +  #initialize boxplot
  stat_summary(fun.y=mean, geom="line", aes(group=Location))  + #add mean line
  stat_summary(fun.y=mean, geom="point") # add mean points

在此处输入图像描述

Here is a solution in which the boxes are plotted to the scale of the depth.这是一个解决方案,其中将框绘制为深度比例。 I also added a slight offset to prevent the boxes from completely overlapping.我还添加了一个轻微的偏移量以防止框完全重叠。

#convert depth to numeric 
 df$depth<- as.numeric(df$depth)

library(ggplot2)
g<-ggplot(df, aes(x=depth, y=observed_otus, color=Location)) +
  geom_boxplot(data=df[df$Location =="GOOD",], aes(x=depth-1, y=observed_otus, group=depth), width=1.5) +
  geom_boxplot(data=df[df$Location =="SALINE",], aes(x=depth+1, y=observed_otus, group=depth),  color="blue", width=1.5) + 
  stat_summary(fun.y=mean, geom="line", aes(group=Location, color=Location))  + 
  stat_summary(fun.y=mean, geom="point", aes(group=Location)) +
  scale_color_manual(values = c("black", "blue"))
print(g)

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM