从 POSIXct 中删除年份并使用 ggplot2 绘制 ts 数据
Drop year from POSIXct and plot ts data with ggplot2
我正在尝试从多年数据框架中删除年份,并在 x 轴上绘制日-月,并使用 geom_smooth() 为不同年份计算。
我的数据结构,最初看起来是这样的:
> str(pmWaw)
'data.frame': 52488 obs. of 5 variables:
$ date : POSIXct, format: "2014-01-01 00:00:00" "2014-01-01 00:00:00" "2014-01-01 00:00:00" "2014-01-01 01:00:00" ...
$ stacja: Factor w/ 273 levels "DsWrocKorzA",..: 26 27 129 26 27 129 26 27 129 26 ...
$ pm25 : num 100 63 NA 69 36 NA 41 31 NA 37 ...
$ pm10 : num 122 68 79 77 38 90 43 32 39 38 ...
$ season: Ord.factor w/ 4 levels "spring (MAM)"<..: 4 4 4 4 4 4 4 4 4 4 ...
使用 lubridate
我将年份和月份添加为单独的变量:
library(lubridate)
pmWaw$year<- year(pmWaw$date)
pmWaw$month<- month(pmWaw$date)
接下来,使用在 Whosebug 上找到的代码,我以 %m-%d
格式计算了月份和日期变量:
pmWaw$month.day<-format(pmWaw$date, format="%m-%d")
#check new variable type:
> typeof(pmWaw$month.day)
[1] "character"
最终我使用的数据框是这样的:
> head(pmWaw)
date stacja pm25 pm10 season year month month.day
1 2014-01-01 00:00:00 MzWarNiepodKom 100 122 winter (DJF) 2014 1 01-01
2 2014-01-01 00:00:00 MzWarszUrsynow 63 68 winter (DJF) 2014 1 01-01
3 2014-01-01 00:00:00 MzWarTarKondra NA 79 winter (DJF) 2014 1 01-01
4 2014-01-01 01:00:00 MzWarNiepodKom 69 77 winter (DJF) 2014 1 01-01
5 2014-01-01 01:00:00 MzWarszUrsynow 36 38 winter (DJF) 2014 1 01-01
6 2014-01-01 01:00:00 MzWarTarKondra NA 90 winter (DJF) 2014 1 01-01
> tail(pmWaw)
date stacja pm25 pm10 season year month month.day
52483 2015-12-30 22:00:00 MzWarAlNiepo 36 47 winter (DJF) 2015 12 12-30
52484 2015-12-30 22:00:00 MzWarKondrat 26 29 winter (DJF) 2015 12 12-30
52485 2015-12-30 22:00:00 MzWarWokalna 36 44 winter (DJF) 2015 12 12-30
52486 2015-12-30 23:00:00 MzWarAlNiepo 39 59 winter (DJF) 2015 12 12-30
52487 2015-12-30 23:00:00 MzWarKondrat 36 39 winter (DJF) 2015 12 12-30
52488 2015-12-30 23:00:00 MzWarWokalna 40 49 winter (DJF) 2015 12 12-30
向 ggplot 传递新值给我三个问题:
ggplot(pmWaw, aes(x=month.day, y=pm25)) +
geom_jitter(alpha=0.5) +
geom_smooth()
第一个(小)问题:month.day 是一个 char 类型变量,ggplot 无法识别它的初始时间序列性质。我可以通过手动将刻度标签设置为月来克服这个问题。
第二个(主要)问题 geom_smooth() 根本没有计算,我不明白为什么?
第三个(主要)问题是我无法找到将 year
添加为两条单独的平滑线的分组变量的解决方案(主要是因为 geom_smooth 根本不存在)。
我的猜测是,所有问题的根源在于我提取月份和日期格式并以字符 class 变量结束的方式。
谁能帮我解决这个问题?任何提示表示赞赏。
看来我找到了可以使用的解决方案:
ggplot(pmWaw, aes(x=month.day, y=pm25, group = year)) +
geom_point(alpha=0.5) +
geom_smooth(aes(color=factor(year)))
解决了问题 2 和 3 - geom smooth 在那里,我可以区分年份。可能不是最好的解决方案,但可能是一个很好的起点
我正在尝试从多年数据框架中删除年份,并在 x 轴上绘制日-月,并使用 geom_smooth() 为不同年份计算。
我的数据结构,最初看起来是这样的:
> str(pmWaw)
'data.frame': 52488 obs. of 5 variables:
$ date : POSIXct, format: "2014-01-01 00:00:00" "2014-01-01 00:00:00" "2014-01-01 00:00:00" "2014-01-01 01:00:00" ...
$ stacja: Factor w/ 273 levels "DsWrocKorzA",..: 26 27 129 26 27 129 26 27 129 26 ...
$ pm25 : num 100 63 NA 69 36 NA 41 31 NA 37 ...
$ pm10 : num 122 68 79 77 38 90 43 32 39 38 ...
$ season: Ord.factor w/ 4 levels "spring (MAM)"<..: 4 4 4 4 4 4 4 4 4 4 ...
使用 lubridate
我将年份和月份添加为单独的变量:
library(lubridate)
pmWaw$year<- year(pmWaw$date)
pmWaw$month<- month(pmWaw$date)
接下来,使用在 Whosebug 上找到的代码,我以 %m-%d
格式计算了月份和日期变量:
pmWaw$month.day<-format(pmWaw$date, format="%m-%d")
#check new variable type:
> typeof(pmWaw$month.day)
[1] "character"
最终我使用的数据框是这样的:
> head(pmWaw)
date stacja pm25 pm10 season year month month.day
1 2014-01-01 00:00:00 MzWarNiepodKom 100 122 winter (DJF) 2014 1 01-01
2 2014-01-01 00:00:00 MzWarszUrsynow 63 68 winter (DJF) 2014 1 01-01
3 2014-01-01 00:00:00 MzWarTarKondra NA 79 winter (DJF) 2014 1 01-01
4 2014-01-01 01:00:00 MzWarNiepodKom 69 77 winter (DJF) 2014 1 01-01
5 2014-01-01 01:00:00 MzWarszUrsynow 36 38 winter (DJF) 2014 1 01-01
6 2014-01-01 01:00:00 MzWarTarKondra NA 90 winter (DJF) 2014 1 01-01
> tail(pmWaw)
date stacja pm25 pm10 season year month month.day
52483 2015-12-30 22:00:00 MzWarAlNiepo 36 47 winter (DJF) 2015 12 12-30
52484 2015-12-30 22:00:00 MzWarKondrat 26 29 winter (DJF) 2015 12 12-30
52485 2015-12-30 22:00:00 MzWarWokalna 36 44 winter (DJF) 2015 12 12-30
52486 2015-12-30 23:00:00 MzWarAlNiepo 39 59 winter (DJF) 2015 12 12-30
52487 2015-12-30 23:00:00 MzWarKondrat 36 39 winter (DJF) 2015 12 12-30
52488 2015-12-30 23:00:00 MzWarWokalna 40 49 winter (DJF) 2015 12 12-30
向 ggplot 传递新值给我三个问题:
ggplot(pmWaw, aes(x=month.day, y=pm25)) +
geom_jitter(alpha=0.5) +
geom_smooth()
第一个(小)问题:month.day 是一个 char 类型变量,ggplot 无法识别它的初始时间序列性质。我可以通过手动将刻度标签设置为月来克服这个问题。
第二个(主要)问题 geom_smooth() 根本没有计算,我不明白为什么?
第三个(主要)问题是我无法找到将 year
添加为两条单独的平滑线的分组变量的解决方案(主要是因为 geom_smooth 根本不存在)。
我的猜测是,所有问题的根源在于我提取月份和日期格式并以字符 class 变量结束的方式。
谁能帮我解决这个问题?任何提示表示赞赏。
看来我找到了可以使用的解决方案:
ggplot(pmWaw, aes(x=month.day, y=pm25, group = year)) +
geom_point(alpha=0.5) +
geom_smooth(aes(color=factor(year)))
解决了问题 2 和 3 - geom smooth 在那里,我可以区分年份。可能不是最好的解决方案,但可能是一个很好的起点