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

ggplot with a lot of groups; subplots (facets) for better arrangement

我有一个数据框,其中包含资产毛利润值、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')

我用 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~.)

我设法得到的是以下内容,这显然是无用的:

我试图拆分组以便每个子图有 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 个行业和平均值)进行精心安排。因为我已经尝试过使用不同的颜色、线型和点,所以我认为最好的方法是一些子图,但也许有人有更好的主意...?

假设我们有如下数据输入:

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()

将几个绘图强制到一个方面的方法之一是创建一个新组。在这种情况下,我将前三个列出的行业分组为 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)

编辑:

可以使用 annotate 函数在所有面上叠加附加线。

首先,用每个时间点的平均值生成摘要table:

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)

请注意,由于地块之间使用的种子不同,额外的 table 看起来有点不同