如何为时间序列制作分组范围图?

How can I make a grouped range plot for a time series?

我想在R中绘制温度时间序列的范围图或散点图。基本上,对于每个区域,我需要分别计算前10年和后10年的温度平均值和降水总和;然后要制作一个参考年份'gdp_percapita(假设 1995 年 gdp_percapita)与前 10 年和最后 10 年的温度平均值和降水总和的范围图。

可重现数据:

这是用实际温度时间序列模拟的可重现数据:

dat= data.frame(index = rep(c('dex111', 'dex112', 'dex113','dex114','dex115'), each = 30), year =1980:2009,
            region= rep(c('Berlin','Stuttgart','Böblingen','Wartburgkreis','Eisenach'), each=30),
            gdp_percapita=rep(sample.int(40, 30), 5),gva_agr_perworker=rep(sample.int(45, 30), 5),
            temperature=rep(sample.int(50, 30), 5), precipitation=rep(sample.int(60, 30), 5))

更新: 这是我到目前为止所做的:

library(tidyverse)
func <- dat %>% 
  group_by(temperature, precipitation) %>% 
  summarize_all(funs(mean, sum))

似乎我错误地获得了前十年和后十年的平均温度和总降水量。任何更正。

func %>% 
  gather(year, region, temperature, precipitation, gdp_percapita) %>% 
  separate(col, into = c("Measurement", "stat")) %>% 
  arrange(region) %>% 
  mutate_at(vars(col, Measurement), fct_inorder) %>% 
  spread(col, val)

但是上面的代码不太适合做剧情,不知道我的代码哪里出了问题?有什么想法吗?

我知道ggplot2 为该数据渲染预期范围图非常了不起,但我尝试重塑数据以制作图是不正确的。有什么办法可以在 R 中制作这个情节?我怎样才能在 ggplot2 中做到这一点?有什么想法吗?

更新:

不是说我为 x 轴上的所有区域选择 gdp_percapita 2000,而所有区域沿 y 轴的周期性平均温差和降水总和差。

想要的地块:

这是所需的温度和降水范围图:

如何使用最少的代码高效地完成我想要的输出?有人能给我指出正确的方向吗?

这是我认为可以满足您要求的解决方案。一般来说,你应该尽量缩小你的问题范围,因为只是说 "I don't know what went wrong" 会让其他人难以使用这个问题。

这里有几个步骤。我想将数据转换为每个区域一行的格式,以使用 summarise 绘制,使用它来获取我们需要的美学参数(geom_pointgeom_linerange)。然后,为了绘制两个不同的组,我们将 gather 它们,以便 decade 可以成为一个组变量。

N.B。我编辑了示例数据,这样它就不再让每个组都具有完全相同的数据,只是有点不同。

geom_text_repelggrepel 包中的一个很好的函数,它使标签更容易添加。我们只想过滤到其中一个组,这样标签就不会出现两次。

library(tidyverse)

set.seed(2346)
dat <- data.frame(
  index = rep(c("dex111", "dex112", "dex113", "dex114", "dex115"), each = 30),
  year = 1980:2009,
  region = rep(c("Berlin", "Stuttgart", "Böblingen", "Wartburgkreis", "Eisenach"), each = 30),
  ln_gdp_percapita = sample.int(40, 150, replace = TRUE),
  ln_gva_agr_perworker = sample.int(45, 150, replace = TRUE),
  temperature = sample.int(50, 150, replace = TRUE),
  recipitation = sample.int(60, 150, replace = TRUE)
)

stats <- dat %>%
  group_by(region) %>%
  summarise(
    ln_gdp = mean(ln_gdp_percapita),
    range_max = max(temperature),
    range_min = min(temperature),
    decade_80s = mean(temperature[which(year %in% 1980:1989)]),
    decade_00s = mean(temperature[which(year %in% 2000:2009)])
  ) %>%
  gather(decade, mean, decade_80s, decade_00s)

ggplot(stats, aes(x = ln_gdp)) +
  geom_point(aes(y = mean, colour = decade)) +
  geom_linerange(aes(ymin = range_min, ymax = range_max)) +
  ggrepel::geom_text_repel(
    data = . %>% filter(decade == "decade_00s"),
    mapping = aes(y = mean, label = region)
    )

reprex package (v0.2.0) 创建于 2018-06-15。