【问题标题】:How can I make a grouped range plot for a time series?如何为时间序列制作分组范围图?
【发布时间】:2018-06-15 17:33:43
【问题描述】:

我想在 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 轴上的所有区域选择了 2000 的 gdp_percapita,而所有区域沿 y 轴的周期性平均温差和降水总和差异。

想要的情节

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

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

【问题讨论】:

  • 该范围是具有两种不同方法的总范围,还是两个不同的范围?
  • @CalumYou 我认为有两种不同的方式,但我也想看看如果使用两个不同的范围会发生什么。谢谢
  • 到目前为止你写了什么代码?
  • 您似乎有几个问题合而为一,第一个问题是如何重塑您的数据,以便您可以在一个轴上获得 2000 GDP,在另一个轴上获得降水/温度。有很多 SO 帖子可以帮助您从宽数据转向长数据:here's one 有 5 个不同的可靠答案
  • 我选择平均值是因为我没有看到您选择的是 1996 年的 GDP,您可以轻松更改它。您只需要一个 GDP 值来绘制该点。您预计多个 GDP 会如何?更多点和更多颜色?单独的面板?请尽可能将自己限制在一个简洁的问题上。

标签: r ggplot2 reshape


【解决方案1】:

这是一个我认为可以满足您需求的解决方案。一般来说,你应该尽量缩小你的问题范围,因为仅仅说“我不知道出了什么问题”会让其他人难以使用这个问题。

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

注意我对样本数据进行了编辑,这样它就不再让每个组都具有完全相同的数据,只是为了有点变化。

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 年 6 月 15 日创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多