2015-11-25 19 views
1

所以目前我有一个数据集,看起来像这样:如何在R中基于时间绘制子组的值?

yearMon  V1 
1 012011 2.534161 
2 012012 1.818421 
3 012013 1.635179 
4 012014 1.609195 
5 012015 1.794979 
6 022011 3.408389 
7 022012 1.756303 
8 022013 1.577855 
9 022014 1.511905 
10 022015 1.748879 
11 032011 2.664336 
12 032012 1.912023 
13 032013 1.408602 
14 032014 1.646091 
15 032015 1.705069 
16 042011 2.532895 
17 042012 3.342926 
18 042013 3.056657 

我每年都要绘制的平均值为某月,IE为2011年3月,2012年3月,2013年3月,2014年3月的平均值都在一张图,并在12个月的每一个月重复这一点。我会如何去做这件事?

+0

我会建议你在几年和几个月内拆分第一列。然后,您可以使用月份列作为stat_summary的因子以按组绘制平均值。或者,您可以按其他因素(搜索聚合)在其他地方计算平均值,然后用新数据框创建一个ggplot –

回答

3

1)monthplot转换数据,以动物园(使用"yearmon"类 - 我们还显示在评论的替代转换器),然后到"ts"类,然后使用monthplot(在R的基极)与"ts"对象(或下面我们使用autoplot.zoo(它使用ggplot2包)与动物园对象)。

library(zoo) 

# to_yearmon <- function(x) as.yearmon((x %% 10000) + (x %/% 10000 - 1)/12) 
to_yearmon <- function(x) as.yearmon(sub("(.*)(....)$", "\\2-\\1", x)) 
ser_zoo <- read.zoo(ser_df, FUN = to_yearmon) # convert to DF to zoo 
ser_ts <- as.ts(ser_zoo) # convert zoo to ts 
monthplot(ser_ts) 

(剧情后继续)

screenshot

2)autoplot.zoo我们展示了如何绘制(一)每年(2011年,2012一线,...)所有在一张图表中和(ii)在单独的小图中和(iii)在一张图表中每月一行(1,2,3,...)和(iv)单独的小组。

我们创建了一个数据框ser_df2,其中3列代表月份,年份和系列值。然后我们将这个长表格系列转换成一个宽表格,ser_zoo2,时间为1,2,3,...代表每年的月份和一列。我们还将这个长表格系列转换为一个广泛的表格,ser_zoo2,其中2011年,2012年......代表每年的一年和一列。通过在单个面板和多个面板中绘制每个图表,我们得到2x2 = 4个图表,我们在下面显示。

library(ggplot2) 
library(gridExtra) 

ser_df2 <- data.frame(month = cycle(ser_zoo), 
         year = floor(as.numeric(time(ser_zoo))), 
         ser = coredata(ser_zoo)) 

ser_zoo2 <- read.zoo(ser_df2, index = 1, split = 2) # split into one column per year 
p1 <- autoplot(ser_zoo2, facet = NULL) 
p2 <- autoplot(ser_zoo2) 

ser_zoo3 <- read.zoo(ser_df2, index = 2, split = 1) # split into one column per month 
p3 <- autoplot(ser_zoo3, facet = NULL) 
p4 <- autoplot(ser_zoo3) 

grid.arrange(p1, p3, p2, p4, ncol = 2) 

(点击图放大)

screenshot

注:我们用这个作为输入数据帧ser_df

Lines <- " 
    yearMon  V1 
1 012011 2.534161 
2 012012 1.818421 
3 012013 1.635179 
4 012014 1.609195 
5 012015 1.794979 
6 022011 3.408389 
7 022012 1.756303 
8 022013 1.577855 
9 022014 1.511905 
10 022015 1.748879 
11 032011 2.664336 
12 032012 1.912023 
13 032013 1.408602 
14 032014 1.646091 
15 032015 1.705069 
16 042011 2.532895 
17 042012 3.342926 
18 042013 3.056657 
" 


ser_df <- read.table(text = Lines) 
1

这里是一个办法做到它更明确地与ggplot:

library(dplyr) 
library(ggplot) 
library(lubridate) 


data %>% 
    mutate(date = 
      yearMon %>% 
      parse_date_time("%m%y"), 
     month = 
      date %>% 
      format("%B") %>% 
      ordered(month.name), 
     year = 
      date %>% 
      format("%Y") %>% 
      as.numeric) %>% 
    ggplot + 
    aes(x = year, y = V1, color = month) + 
    geom_line()