【问题标题】:How to get multi-variable facets using tmap for raster maps (tm_raster() +tm_facets())如何使用 tmap 为栅格地图获取多变量构面 (tm_raster() +tm_facets())
【发布时间】:2019-06-23 02:33:09
【问题描述】:

我想使用 tmap 包使用我的栅格数据创建多面地图。 最终结果将是多个显示“值”的栅格地图,其中行显示“class1”地图,列显示“class2”地图,如下图示例所示:

我尝试了多种方法都没有成功。我认为问题在于以正确的格式构建栅格砖层。不胜感激。

library(tmap)
library(dplyr)
library(magrittr)
library(raster)

r<-data.frame(lat=c(rep(12.25,5),rep(12.5,5)),
          lon=c(rep(c(-72.25,-71.75,-71.25,-70.25,-69.25),2)),
          value=runif(10));r
rx<-sp::SpatialPointsDataFrame(sp::SpatialPoints(coords= 
(cbind(r$lon,r$lat))),data=r%>%dplyr::select(value))
rx@data
sp::gridded(rx)<-T
rx<-raster(rx);rx
r
tm_shape(rx)+tm_raster()
# This works and shows one of the raster maps I would like.


m1<-r%>%dplyr::mutate(class1="class1_A",class2="class2_A",value=value*0.5)
m2<-r%>%dplyr::mutate(class1="class1_A",class2="class2_B",value=value*3)
m3<-r%>%dplyr::mutate(class1="class1_B",class2="class2_B",value=value*10)
m<-bind_rows(m1,m2,m3);m

mx<-sp::SpatialPointsDataFrame(sp::SpatialPoints(coords= 
(cbind(m$lon,m$lat))),data=m)
sp::gridded(mx)<-T
mx@data
# mx@data shows the data.frame with the lat/lon and the classes. 
# I would like to plot this as facets
mxr<-brick(mx)
tm_shape(mxr)+tm_raster(col="value")+tm_facets(by="class1","class2")

【问题讨论】:

    标签: r r-raster tmap


    【解决方案1】:

    使用 ggplot2 而不是 tmap 的答案:

    library(dplyr)
    library(ggplot2)
    
    r <- data.frame(lat = c(rep(12.25, 5), rep(12.5, 5)),
                    lon = c(rep(c(-72.25, -71.75, -71.25, -70.25, -69.25), 2)),
                    value = runif(10))
    
    m1 <- r %>% dplyr::mutate(class1 = "class1_A",
                          class2 = "class2_A",
                          value = value * 0.5)
    m2 <- r %>% dplyr::mutate(class1 = "class1_A",
                          class2 = "class2_B",
                          value = value * 3)
    m3 <- r %>% dplyr::mutate(class1 = "class1_B",
                          class2 = "class2_B",
                          value = value * 10)
    m4 <- r %>% dplyr::mutate(class1 = "class1_B",
                              class2 = "class2_A",
                              value = value * 6)
    m <- bind_rows(m1, m2, m3, m4)
    head(m)
    #>     lat    lon      value   class1   class2
    #> 1 12.25 -72.25 0.07352787 class1_A class2_A
    #> 2 12.25 -71.75 0.44638923 class1_A class2_A
    #> 3 12.25 -71.25 0.20745736 class1_A class2_A
    #> 4 12.25 -70.25 0.48200665 class1_A class2_A
    #> 5 12.25 -69.25 0.06922203 class1_A class2_A
    #> 6 12.50 -72.25 0.12036249 class1_A class2_A
    
    # probably you should also add + coord_map()
    ggplot(m, aes(x = lat, y = lon, fill = value)) + 
      geom_tile() +
      facet_grid(class1~class2) 
    

    由reprex package (v0.2.1) 于 2019 年 1 月 31 日创建

    【讨论】:

    • 谢谢!这很棒,现在可以使用。最终,我想使用 tmaps 来解决它,因为我添加了其他 tmap 图层,这些图层在此之下和之上,并且最好具有相同的格式。如果我弄清楚了,我会在这里发布。
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2020-04-06
    • 2013-05-19
    相关资源
    最近更新 更多