【问题标题】:How to overlap multiple maps into a single one?如何将多张地图重叠成一张?
【发布时间】:2020-03-01 17:59:51
【问题描述】:

我使用 ggplot2 使用以下代码创建了 9 个不同的世界地图,每个地图都彼此不同,并显示了九个变量中每个变量在全局级别的分布。请注意,每个像素只能通过单个 Var 来“识别”:

    ggplot(aes(x = lat, y = lon), data = DF )+geom_tile(aes(fill = "Var1"))+ 
  geom_polygon(aes(x = long, y = lat, group = group),
               data = map_data('world'),
               fill = NA, color = "#515151",
               size = 0.15) + scale_colour_discrete(drop = TRUE) + country_shapes

我现在要做的是将它们中的每一个叠加起来以得到最终的单个地图。但无法弄清楚如何做到这一点。有什么建议吗?

enter image description here

编辑 这里是虚拟df:

structure(list(lat = c(154.7916667, 154.7083333, 153.9583333, 
152.125, 150.0416667, 150.0416667), lon = c(49.54166667, 49.29166667, 
48.95833333, 47.04166667, -22.20833333, -22.29166667), Var1 = c(0, 
0, 0, 0, 1.453369498, 1.458679557), Var2 = c(0.154323816, 0.210961819, 
0, 0.173637688, 0, 0), Var3 = c(0, 0, 0, 0, 0, 0), Var4 = c(0, 
0, 0, 0, 0, 0), Var5 = c(0L, 0L, 0L, 0L, 0L, 0L), Var6 = c(0L, 
0L, 0L, 0L, 0L, 0L), Var7 = c(0, 0, 0, 0, 0, 0), Var8 = c(0L, 
0L, 0L, 0L, 0L, 0L), Var9 = c(0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 
6L), class = "data.frame")

【问题讨论】:

  • 您能否使用相同的示例进行详细说明。很难看出你想做什么?如果你有 9 张不同的地图,你怎么可能叠加它们?
  • @89_simple 添加了几行。这个想法是得到一张结合每张地图信息的最终地图。更清晰? ;)

标签: r ggplot2 mapping


【解决方案1】:

编辑

library(tidyr)
dat_l <- tidyr::gather(dat, variable, value, Var1:Var9)

如果 0 表示变量没有数据,则只需删除零

 dat_l <- dat_l %>% dplyr::filter(value != 0)
 unique(dat_l$variable)
 "Var1" "Var2"

删除所有零后,我只剩下Var1Var2。所以

  library(ggthemes)
  library(ggplot2)

  ggplot() +
  geom_point(data = dat_l , aes(x = lon, y = lat, col = factor(variable))) + 
  theme_map() + coord_equal() + 
  geom_path(data = map_data('world'), aes(long, lat, group = group), col = 
  'black') + 
   theme(legend.position = 'top', legend.title = element_blank()) 

我已尝试根据我的理解重新创建您的数据结构,并将它们合并为一个长 下面的 dataframe.my.df 将具有唯一的 lon lat 和 10 个变量 'var1' 到 'var10' 的值。

  library(data.table)
  tempList <- list()
  for(i in 1:10){

    temp <- as.data.frame(cbind(runif(10,-10.85, 20.02),runif(10, 49.82,59.47)))
    temp$var <- paste0('var',i)
    temp$value <- i
    tempList[[i]] <- temp
  }

  my.df <- rbindlist(tempList)
  names(my.df)[1:2] <- c('lon', 'lat')

如果你查看my.df,你会看到它有随机的 lat lon 并且每个 lat long 只有一个值 var 从 1 到 9。它只是一个长数据帧,它按行合并了您的个人数据帧 然后我使用 ggplot 绘制如下

  library(ggthemes)
  library(ggplot2)

  ggplot() +
  geom_point(data = my.df , aes(x = lon, y = lat, col = factor(value))) + 
  theme_map() + coord_equal() + 
  geom_path(data = map_data('world'), aes(long, lat, group = group), col = 'black') + 
  theme(legend.position = 'top', legend.title = element_blank()) 

【讨论】:

  • @谢谢。我理解你的想法。我仍然无法用我的数据重现相同的内容。我刚刚包含了我的 df 的虚拟版本。知道你想得到什么但没有得到它有点令人沮丧.. :/
  • 值 0 是否有意义,或者只是可以用 NA 替换?
  • 我已经编辑了我的答案并使用了您的数据。看看这是不是你打算做的
  • 谢谢!我包括了我所有的 9 个变量,它运行顺利 :)
  • 我确实已经接受了您的回答,只是我没有足够的“声誉”并且不会公开显示。 thx 的链接。我去看看:)
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多