【问题标题】:ggplot and lapply /mapply for nested list and data framesggplot 和 lapply /mapply 用于嵌套列表和数据框
【发布时间】:2020-07-08 14:57:44
【问题描述】:

编辑:

我确实找到了一种方法来做我需要的事情,但现在我无法为每个创建的图显示标题,因此我知道我正在查看哪个网站:

lapply(seq(gl), function(i){
    lapply(seq(gl[[i]]), function(j){
        ggplot() +
            geom_point(data = gl[[i]][[j]], aes(x = `UTC_date.1`, y = `actSWE_mm`, color = `swe_Res_mm`))+
            geom_segment(data = gl[[i]][[j]], aes(x = `UTC_date.1`, y = `actSWE_mm`, xend = `UTC_date.1`, yend = `swe_mm`), alpha=.2)+
            scale_color_steps2(low = "blue", mid = "white", high = "red") +
            guides(color = FALSE) + geom_point(data = gl[[i]][[j]], aes(x = `UTC_date.1`, y = `swe_mm`), shape = 1) + 
            facet_wrap(vars(year), scales="free_x") +  theme_bw() 
    })})

我尝试添加:

主题(plot.title = paste(names(gl)[i], names(gl[[i]])[j], sep = "_"))

但这似乎不起作用。


原文:

我有一个代表每个月的 12 个数据框的列表。在每个数据框中都有几个不同站点的时间序列测量值。下面是一月份数据的表格示例(不是实际数据)(monthSplit 是列表 - monthSplit$January):

 site_id   UTC_date.1    swe_mm    actSWE_mm  swe_Res_mm  Month        Year
     <int>   <date>       <dbl>       <dbl>       <dbl>   <chr>        <num>
     1003 2005-01-01 2   54.2        0.241      53.059    "January"     2005
     1003 2005-01-02 2   54.2        0.241      53.059    "January"     2005
     958  2005-01-01 2   154.2       0.241      153.059   "January"     2005
     946  2005-01-01 2   154.2       152.25     1.95      "January"     2005
     946  2005-01-02 2   500.2       550.241    50.059    "January"     2005
    

我在尝试对需要被唯一站点进一步子集的数据框列表执行 ggplot 时遇到两个问题。

我尝试创建一个ggplot函数并使用mapply:

plot_fun = function(d) {
  ggplot(d, aes(x = `UTC_date.1`, y = `actSWE_mm`)) +
    geom_segment(aes(xend = `UTC_date.1`, yend = `swe_mm`), alpha=.2) + geom_point(aes(color = `swe_Res_mm`))  +
    scale_color_steps2(low = "blue", mid = "white", high = "red") +
    guides(color = FALSE) + geom_point(aes(y = `swe_mm`), shape = 1) + 
    facet_wrap(vars(year), scales="free_x") +  theme_bw() 
}
pltlist = mapply(plot_fun, d = monthSplit, SIMPLIFY=FALSE)

这产生了正确格式的绘图和所有内容,但是它没有被 site_id 分割。因此,它创建了一个包含多个图的图,其中包含每年当月的图值。 EG:九月图在一个窗口中产生了 13 个图,代表 2003-2015 年 9 月的每一年。问题是,所有的网站都集中在​​那里。

在查看实际数据时(如上述绘图函数的情况),由于数据范围在 y 轴上变化如此之大,因此无法从绘图中获得任何意义。

我想知道如何通过 site_id 进一步拆分地块列表,以便每个地块中只出现一个站点以进行比较。

【问题讨论】:

标签: r list ggplot2 mapply


【解决方案1】:

如果您希望每个 site_id 有一个颜色点和线,请添加 group = site_id,例如

plot_fun = function(d) { ggplot(d, aes(x = UTC_date.1, y = actSWE_mm, group = site_id)) + geom_segment(aes(xend = UTC_date.1, yend = swe_mm), alpha=.2) + geom_point(aes(color = swe_Res_mm)) + scale_color_steps2(low = "blue", mid = "white", high = "red") + guides(color = FALSE) + geom_point(aes(y = swe_mm), shape = 1) + facet_wrap(vars(year), scales="free_x") + theme_bw() }

(请注意,我必须删除所有的 '`' 字符,因为那是代码字符)。 不是这个提议没有提供更多的地块,而是每个地块有更多的线。

如果您希望每个 site_id 有一个图,您可以按该变量拆分数据集,或将其包含在 facet_wrap 中: facet_wrap(facets = ~ year + site_id, scales="free_x")

如果每个站点的尺度差异很大,我会使用对数尺度。但是,此时无法绘制零值和负值,这是一个缺点。

【讨论】:

  • 这肯定有助于至少区分同一地块上的站点。谢谢!这适用于标准化残差。现在我只需要弄清楚如何分割地块。如果我再次使用 split 会感觉很混乱,因为它已经是列表中的一组数据帧,然后会再次拆分?
  • 您可以拆分和取消列出列表以获得 1 级列表而不是 2 级列表。或者使用 purrr 中的 flatten:见 here
  • 顺便说一句,如果所有数据都具有相同的格式(使用 rbind)然后为每个图选择子集,将它们放在一个数据集中不是更容易吗?它允许发生其他切片而不是您用于拆分的切片。
  • 我明白你在说什么,但我不确定我理解之后如何调用它?如果我使用 rbind,我会得到一个包含每个月列表的矩阵。
  • 我的意思是 rbind 应该将它们堆叠到一个 data.frame 中,并带有一个额外的列来标识数据集。
猜你喜欢
  • 2021-03-31
  • 2020-02-24
  • 2017-11-23
  • 2011-10-12
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多