【问题标题】:How create a box plot + line plot in a single plot using ggplot2如何使用 ggplot2 在单个图中创建箱线图 + 线图
【发布时间】:2021-09-22 01:52:33
【问题描述】:

我想使用 ggplot2 在单个图中创建一个箱线图 + 线图

这是我现在的代码:

library(ggplot2)
dat <- data.frame(day = c(0,0,0,0,0,0,10,10,10,10,10,10,14,14,14,14,14,14,21,21,21,21,21,21,28,28,28,28,28,28,35,35,35,35,35,35,42,42,42,42,42,42), group = c('Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP'), score = c(37.5,43,7,63,26,15,17,16,43,26,53,26,26,26,43,10,6,15,18,9,10,4,8,18,60,26,20,12.5,9,43,43,43,11,10,7,60,43,43,32,10.5,8,57.5))


g1 = ggplot(data = dat, aes(x = factor(day), y = score)) +
  geom_boxplot(aes(fill = group))

g1

在做箱线图时,我想分别表示不同治疗(组)的分数,所以我让 x = 因子(天)。 但是对于线图,我希望每天的得分是当天两次治疗(组)的平均值。

This is how my plot look like now

This is how I want my plot to look

我该怎么做?非常感谢!

【问题讨论】:

  • 请编辑您的问题以将数据包含为代码。不要指望人们从您的图像中逐个单元格地在 R 中创建数据框。
  • 例如:dat &lt;- data.frame(day = c(1,2,3), group = c(4,5,6))
  • 嗨,欢迎@Jason 堆栈溢出。似乎在这里回答了一个类似的问题:stackoverflow.com/questions/26039119/…。解决方案可能类似于stat_summary(aes(group=1), fun.y=mean, colour="red", geom="line",group=1)

标签: r ggplot2


【解决方案1】:
#Libraries

library(tidyverse)

#Data

dat <- data.frame(day = c(0,0,0,0,0,0,10,10,10,10,10,10,14,14,14,14,14,14,21,21,21,21,21,21,28,28,28,28,28,28,35,35,35,35,35,35,42,42,42,42,42,42), group = c('Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP','Saline','RP','Saline','Saline','RP','RP'), score = c(37.5,43,7,63,26,15,17,16,43,26,53,26,26,26,43,10,6,15,18,9,10,4,8,18,60,26,20,12.5,9,43,43,43,11,10,7,60,43,43,32,10.5,8,57.5))


#How to

dat %>% 
  ggplot(aes(x = factor(day), y = score)) +
  geom_boxplot(aes(fill = group))+
  geom_line(
    data = dat %>% 
      group_by(day) %>% 
      summarise(score = median(score,na.rm = TRUE)),
    aes(group = 1),
    size = 1,
    col = "red"
  )

【讨论】: