问题描述
ID Date parameter1 parameter2 parameter3
1 01/01/20 10 11 12
1 03/01/20 12 13 14
1 05/01/20 11 15 14
2 02/01/20 17 16 15
2 07/01/20 14 12 18
3 04/02/20 11 12 13
3 06/02/20 12 14 16
现在,如果我必须为这些值的趋势制作一个ggplot图,并标记为唯一ID,我该写什么代码
解决方法
有许多方法可以按照您的描述来绘制此数据。这可能不是您要找的内容,因此,如果您需要其他内容,请更加具体。
首先,我们以显示的格式开始处理您的数据:
df <- structure(list(ID = c(1L,1L,2L,3L,3L),Date = structure(c(1L,5L,7L,4L,6L),.Label = c("01/01/20","02/01/20","03/01/20","04/02/20","05/01/20","06/02/20","07/01/20"),class = "factor"),parameter1 = c(10L,12L,11L,17L,14L,12L),parameter2 = c(11L,13L,15L,16L,14L),parameter3 = c(12L,18L,16L)),class = "data.frame",row.names = c(NA,-7L))
df
#> ID Date parameter1 parameter2 parameter3
#> 1 1 01/01/20 10 11 12
#> 2 1 03/01/20 12 13 14
#> 3 1 05/01/20 11 15 14
#> 4 2 02/01/20 17 16 15
#> 5 2 07/01/20 14 12 18
#> 6 3 04/02/20 11 12 13
#> 7 3 06/02/20 12 14 16
我们希望Date
列代表实际日期(目前是字符或因子向量),因此我们用strptime
进行转换:
df$Date <- as.POSIXct(strptime(df$Date,format = "%d/%m/%y",tz = "GMT"))
要将所有数据绘制在单个图表中,如果我们将其从宽格式转换为长格式,则将更加容易。我们可以使用tidyr::pivot_longer
:
df <- tidyr::pivot_longer(df,c("parameter1","parameter2","parameter3"))
df
#> # A tibble: 21 x 4
#> ID Date name value
#> <int> <dttm> <chr> <int>
#> 1 1 2020-01-01 00:00:00 parameter1 10
#> 2 1 2020-01-01 00:00:00 parameter2 11
#> 3 1 2020-01-01 00:00:00 parameter3 12
#> 4 1 2020-01-03 00:00:00 parameter1 12
#> 5 1 2020-01-03 00:00:00 parameter2 13
#> 6 1 2020-01-03 00:00:00 parameter3 14
#> 7 1 2020-01-05 00:00:00 parameter1 11
#> 8 1 2020-01-05 00:00:00 parameter2 15
#> 9 1 2020-01-05 00:00:00 parameter3 14
#> 10 2 2020-01-02 00:00:00 parameter1 17
#> # ... with 11 more rows
现在我们准备绘制。我们将生成3个方面,每个ID对应一个。这些将包含每个ID的数据点,每个参数的颜色都不同。然后,我们将使用geom_smooth
绘制最合适的直线:
library(ggplot2)
ggplot(df,aes(Date,value,colour = name)) +
geom_point() +
geom_smooth(method = lm,formula = y ~ x,se = FALSE,linetype = 2) +
scale_x_datetime(date_labels = "%d-%b") +
facet_wrap(ID~.,scales = "free_x") +
theme(axis.text.x.bottom = element_text(angle = 45,hjust = 1))
由reprex package(v0.3.0)于2020-08-20创建