ggplot有很多小组;子图(facets)以便更好地安排

时间:2017-06-06 22:11:49

标签: r ggplot2 visibility facet subplot

我有一个数据框,其中包含资产毛利润,10个行业类别以及从1970年到2015年的长格式的e时间跨度值。我想绘制这些时间序列和(整体)均值中的每一个。但问题是,情节变得非常混乱。因此我想把它分成两个或三个子图。我正在使用ggplot并设法绘制时间序列,但我无法弄清楚如何以正确的方式制作子图。

df <- melt(sic_j[1:11], id.vars='time', variable.name='Industry')
> head(df, 20)
   time                       Industry     value
1  1970 Agriculture, Forestry, Fishing 0.4450458
2  1971 Agriculture, Forestry, Fishing 0.3834808
3  1972 Agriculture, Forestry, Fishing 0.3970010
4  1973 Agriculture, Forestry, Fishing 0.3993006
5  1974 Agriculture, Forestry, Fishing 0.3960956
6  1975 Agriculture, Forestry, Fishing 0.4052760
7  1976 Agriculture, Forestry, Fishing 0.3856735
8  1977 Agriculture, Forestry, Fishing 0.4062286
9  1978 Agriculture, Forestry, Fishing 0.3631151
10 1979 Agriculture, Forestry, Fishing 0.3987136
11 1980 Agriculture, Forestry, Fishing 0.3926147
12 1981 Agriculture, Forestry, Fishing 0.3207508
13 1982 Agriculture, Forestry, Fishing 0.3638654
14 1983 Agriculture, Forestry, Fishing 0.2901777
15 1984 Agriculture, Forestry, Fishing 0.3329089
16 1985 Agriculture, Forestry, Fishing 0.3384187
17 1986 Agriculture, Forestry, Fishing 0.3142270
18 1987 Agriculture, Forestry, Fishing 0.3610059
19 1988 Agriculture, Forestry, Fishing 0.2502937
20 1989 Agriculture, Forestry, Fishing 0.3156292

ggplot(df, aes(x=time, y=value))+
  geom_line(aes(group=Industry, color=Industry))+
  stat_summary(fun.y=mean, na.rm=T, group=11, alpha=1, color='red', size=1.5, geom='line')+
  theme_bw()+
  labs(x='year', y='gross profits on assets',
    color=NULL)+theme(legend.position = 'bottom')

enter image description here

我尝试了下面的facet_grid:

ggplot(df, aes(x=time, y=value))+
  geom_line(aes(group=Industry, color=Industry))+
  stat_summary(fun.y=mean, na.rm=T, group=11, alpha=1, color='red', size=1.5, geom='line')+
  theme_bw()+
  labs(x='year', y='gross profits on assets',
    color=NULL)+theme(legend.position = 'bottom')+facet_grid(Industry~.)

我设法获得的是以下内容,这显然是无用的: enter image description here

我试图拆分这些组,以便每个子图有3-4个行业,但我收到了这个错误:

Error in combine_vars(data, params$plot_env, vars, drop = params$drop) : 
  At least one layer must contain all variables used for facetting

最后,我想有一个精心安排的这11个时间序列(10个行业和平均值)的情节。由于我已经尝试过不同的颜色,线型和点,我认为最好的方法是一些子图,但也许有人有更好的想法......?

1 个答案:

答案 0 :(得分:1)

考虑我们有一个数据输入如下:

time <- 1970:2011
industry <- letters[1:10]

dat <- expand.grid(time=time, industry=industry)
dat$value <- rnorm(nrow(dat))

这些数据的ggplot会像问题一样令人困惑:

ggplot(dat, aes(time, value, colour=industry)) + 
    geom_line()

enter image description here

将一些图表强制成单个方面的方法之一是创建一个新组。在这种情况下,我将前三个列出的行业归为group_one,接下来的三个归为group_two,其余为group_three

library(tidyverse)
dat2 <- dat %>% 
   mutate(group_one = ifelse(industry %in% letters[1:3], value, NA),
           group_two = ifelse(industry %in% letters[4:6], value, NA),
           group_three = ifelse(industry %in% letters[7:10], value, NA)) %>%
   gather(variable, new_val, group_one:group_three)

带有方面的新情节现在看起来有点整洁:

ggplot(dat2, aes(time, new_val, colour=industry)) + geom_line() + 
    facet_wrap(~variable, ncol=1)

enter image description here

编辑:

可以使用annotate功能覆盖所有方面的附加线。

首先,生成每个时间点的平均值的汇总表:

dat3 <- dat %>% 
    group_by(time) %>% 
    summarise(mean.value=mean(value))

将注释添加到上面的ggplot:

ggplot(dat2, aes(time, new_val, colour=industry)) + 
  geom_line() + 
  facet_wrap(~variable, ncol=1) + 
  annotate(geom="line", x=dat3$time, y=dat3$mean.value, 
           color='red', size=1.5)

enter image description here

请注意,由于图表之间使用的种子不同,附加表看起来有点不同