问题描述
我正在尝试在 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()
目前,我已经绘制了点,但我不知道如何连接这些点以创建折线图。非常感谢您的帮助!
解决方法
您需要在数据中使用 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))
另一种方法(代替 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))
虽然在美学上可以说是可以改进的,但我认为它的结构应该足够清晰。