我几乎每月都会进行一系列观测,并希望将其绘制出来。 某些月份可能有多个观察结果,因此这一天很重要。
我可以轻松地将它们绘制成一条线,但是我希望每年的观测值都绘制在一条单独的线上,以便可以在年份之间进行比较(即一条线代表2018年,另一条代表2019年,另一条代表2020年。) / p>
我希望我的x轴从1月1日到12月31日。
数据
Date Value
2018-04-30 NA
2018-05-31 102
2018-06-29 27
2018-07-01 3
2018-07-31 27
2018-09-04 52
2018-09-05 1
2018-10-01 78
2018-10-31 117
2018-11-30 245
2019-01-02 201
2019-01-31 256
2019-02-28 228
2019-04-01 155
2019-05-01 111
2019-05-31 105
2019-07-01 77
2019-07-31 61
2019-08-30 79
2019-10-01 76
2019-10-31 104
2019-12-03 196
2020-01-02 162
2020-01-31 292
2020-02-28 266
2020-03-26 145
2020-05-01 130
2020-06-03 86
2020-07-01 42
这是我到目前为止尝试过的,可以访问软件包“ ggplot2”,“ dplyr”,“ zoo”和“ lubridate”
ggplot(a, aes(x = Date, y = Value)) +
geom_point() +
geom_line() +
scale_x_date(date_minor_breaks = "1 month", date_labels = "%B %Y") +
theme_bw()
答案 0 :(得分:1)
也许这会有所帮助。您必须先按年份设置日期格式以进行分组和颜色设置。您可以欺骗轴,增加一个像2020这样的普通年份。这里是可能的解决方案:
library(tidyverse)
#Data
df <- structure(list(Date = c("2018-04-30", "2018-05-31", "2018-06-29",
"2018-07-01", "2018-07-31", "2018-09-04", "2018-09-05", "2018-10-01",
"2018-10-31", "2018-11-30", "2019-01-02", "2019-01-31", "2019-02-28",
"2019-04-01", "2019-05-01", "2019-05-31", "2019-07-01", "2019-07-31",
"2019-08-30", "2019-10-01", "2019-10-31", "2019-12-03", "2020-01-02",
"2020-01-31", "2020-02-28", "2020-03-26", "2020-05-01", "2020-06-03",
"2020-07-01"), Value = c(NA, 102L, 27L, 3L, 27L, 52L, 1L, 78L,
117L, 245L, 201L, 256L, 228L, 155L, 111L, 105L, 77L, 61L, 79L,
76L, 104L, 196L, 162L, 292L, 266L, 145L, 130L, 86L, 42L)), row.names = c(NA,
-29L), class = "data.frame")
下一个代码:
#Format dates
df$Date <- as.Date(df$Date)
#Create year
df$Year <- format(df$Date,'%Y')
#Create day and month of year
df$Day <- format(df$Date,'%d')
df$Month <- format(df$Date,'%m')
#Assign a dummy date
df$DayMonth <- as.Date(paste0(2020,'-',df$Month,'-',df$Day))
#Now sketch for plot
ggplot(df, aes(x = DayMonth, y = Value,group=Year,color=Year)) +
geom_point() +
geom_line() +
scale_x_date(date_minor_breaks = "1 month", date_labels = "%B %d")+
theme_bw()+
theme(axis.text.x = element_text(angle=90))