微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 R 中绘制多个折线图

如何解决在 R 中绘制多个折线图

我正在尝试在 R 中创建一个图,以显示随时间推移的术后结果。数据框中的每一行在手术后的不同时间点最多有 8 个测量值(有一些缺失值),对于每一行,我想创建一个折线图,显示测量值随时间的变化。这是一个示例数据框:

dat <- data.frame(Preop=c(-2,0.5,-0.25,1.5),PO_1M=c(-1.5,0.2,-0.1,1.0),PO_6M=c(-1.2,0.1,-0.05,0.5),PO_1Y=c(-1.0,0.05,0.25))
dat

我已尝试使用以下代码重新排列数据并获得随时间变化的点图,但我想更改此设置,以便维护每一行并可以创建折线图。

library(tidyverse)
dat2<-dat %>% tidyr::pivot_longer(cols=Preop:PO_1Y)

dat2$nummonths<-ifelse(dat2$name=='Preop',ifelse(dat2$name=='PO_1M',1,ifelse(dat2$name=='PO_6M',6,ifelse(dat2$name=='PO_1Y',12,NA))))

ggplot(dat2,aes(nummonths,value))+geom_point()

我希望图表看起来像这样:

enter image description here

目前,我已经绘制了点,但我不知道如何连接这些点以创建折线图。非常感谢您的帮助!

解决方法

您需要在数据中使用 id 排序,以便按它分组并相应地绘制它。以下是帮助您入门的 dplyr 建议:

library(dplyr)
# library(tidyr) # pivot_longer
library(ggplot2)
dat %>%
  mutate(id = factor(row_number())) %>%
  tidyr::pivot_longer(cols=Preop:PO_1Y) %>%
  mutate(NumMonths = case_when(name == "Preop" ~ 0,name == "PO_1M" ~ 1,name == "PO_6M" ~ 6,name == "PO_1Y" ~ 12,TRUE ~ NA_real_)) %>%
  ggplot(aes(NumMonths,value)) + geom_path(aes(group = id,color = id))

sample ggplot2

另一种方法(代替 case_when)是定义一个 Months 查找表,将名称映射到月份数,然后您可以轻松地使用它为您的绘图添加一些上下文:

Months <- tibble(
  name = c("Preop","PO_1M","PO_6M","PO_1Y"),NumMonths = c(0,1,6,12)
)
dat %>%
  mutate(id = factor(row_number())) %>%
  tidyr::pivot_longer(cols=Preop:PO_1Y) %>%
  left_join(.,Months,by = "name") %>%
  ggplot(aes(NumMonths,value)) +
    geom_text(aes(y = -Inf,label = name),data = Months,hjust = 0,vjust = 0,angle = 90) +
    geom_path(aes(group = id,color = id)) +
    geom_point(aes(group = id,color = id))

improved ggplot2

虽然在美学上可以说是可以改进的,但我认为它的结构应该足够清晰。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。