【问题标题】:Drop year from POSIXct and plot ts data with ggplot2 [duplicate]从 POSIXct 中删除年份并使用 ggplot2 绘制 ts 数据 [重复]
【发布时间】:2017-06-21 20:13:27
【问题描述】:

我正在尝试从多年数据框中删除年份,并在 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)

接下来,使用在 stackoverflow 上找到的代码,我计算了 %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 根本不存在)。

我的猜测是,所有问题的根源在于我提取月份和日期格式并最终得到一个字符类变量的方式。

谁能帮我解决它?任何提示表示赞赏。

【问题讨论】:

    标签: r ggplot2 time-series lubridate


    【解决方案1】:

    看起来我找到了一个可以使用的解决方案:

    ggplot(pmWaw, aes(x=month.day, y=pm25, group = year)) + 
    geom_point(alpha=0.5) +
    geom_smooth(aes(color=factor(year)))
    

    解决了问题 2 和 3 - 几何平滑在那里,我可以区分年份。可能不是最好的解决方案,但可能是一个很好的起点

    【讨论】:

      猜你喜欢
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多