【问题标题】:Plot 2 tmap objects side-by-side并排绘制 2 个 tmap 对象
【发布时间】:2018-06-26 11:29:15
【问题描述】:

示例:

我想并排绘制两个 tmap 图,它们是由这段代码生成的。

library(tmap)
library(gridExtra)

data(World)

plot1=
  tm_shape(World, projection = "merc") + 
  tm_layout("", inner.margins=c(-1.72, -2.05, -0.75, -1.56)) +
  tm_borders(alpha = 0.3, lwd=2)

plot2=
  tm_shape(World, projection = "merc") + 
  tm_layout("", inner.margins=c(-1.72, -2.05, -0.75, -1.56)) +
  tm_borders(alpha = 0.3, lwd=2)

plot1plot2 可以作为单个独立图正常工作:

问题:

我无法将两个图并排放置。我试过了:

grid.arrange(plot1, plot2) 通过错误Error in arrangeGrob(..., as.table = as.table, clip = clip, main = main, : input must be grob!。我认为这应该可以工作(使用gridExtra),因为tmap 似乎基于grid graphics system

par(mfrow=c(1,2)) 也不起作用,因为它只显示一个情节(猜测这与 tmap 情节不遵循 base graphics system 相关)。

问题:

如何并排绘制 plot1plot2 两个对象 (ncol=2)?

更新

关于建议的基于网格的解决方案,我得到的是重叠图而不是两列排列的图。

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)

locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] tmap_1.0    dplyr_0.4.3 sp_1.1-1   

loaded via a namespace (and not attached):
 [1] assertthat_0.1     class_7.3-11       classInt_0.1-23    colorspace_1.2-6   DBI_0.3.1          digest_0.6.8       e1071_1.6-4        ggplot2_1.0.1     
 [9] grid_3.1.2         gridBase_0.4-7     gtable_0.1.2       lattice_0.20-29    magrittr_1.5       MASS_7.3-35        munsell_0.4.2      parallel_3.1.2    
[17] plyr_1.8.3         proto_0.3-10       R6_2.1.1           raster_2.3-40      RColorBrewer_1.1-2 Rcpp_0.12.2        reshape2_1.4.1     rgdal_0.8-16      
[25] rgeos_0.3-11       scales_0.3.0       stringi_1.0-1      stringr_1.0.0      tools_3.1.2 

【问题讨论】:

    标签: r graphics choropleth tmap


    【解决方案1】:

    tmap_arrange()

    https://cran.r-project.org/web/packages/tmap/tmap.pdf

    data(World)
    w1 <- qtm(World, projection = "eck4", title="Eckert IV")
    w2 <- qtm(World, projection = "merc", title="Mercator")
    w3 <- qtm(World, projection = "wintri", title="Winkel-Tripel")
    w4 <- qtm(World, projection = "robin", title="Robinsin")
    
    current.mode <- tmap_mode("plot")
    tmap_arrange(w1, w2, w3, w4)
    tmap_mode(current.mode)
    

    【讨论】:

      【解决方案2】:

      好问题!

      grid.arrange 不支持 tmap 绘图(还没有?),就像它支持 ggplot2 绘图一样。

      有两种选择:

      1) 通过为美学分配两个值来使用小倍数(参见tm_facets 中的示例)。你的情节不使用美学,但你可以这样欺骗:

      tm_shape(World, projection = "merc") + 
        tm_fill(col=c("white", "white")) +
        tm_layout("", inner.margins=c(-1.72, -2.05, -0.75, -1.56)) +
        tm_borders(alpha = 0.3, lwd=2)
      

      2) 使用grid 包定义视口:

      library(grid)
      grid.newpage()
      pushViewport(viewport(layout=grid.layout(1,2)))
      print(plot1, vp=viewport(layout.pos.col = 1))
      print(plot2, vp=viewport(layout.pos.col = 2))
      

      另外,除了用负内边距剪裁形状,您还可以在tm_shape 中使用边界框参数:

      tm_shape(World, projection = "merc", xlim=c(-2e6, 6.5e6), ylim=c(-4e6, 8.5e6)) + 
        tm_borders(alpha = 0.3, lwd=2)
      

      它生成相同的地图,但代码更简洁。

      【讨论】:

      • 非常感谢,不幸的是仍然有 2 个问题:a) 基于网格的解决方案绘制到绘图,但它们确实重叠。 b)使用倍数的解决方案创建了两个对齐的图,但在 1 列而不是 2 列中。
      • 你能贴一张问题 a 的图片吗?至于问题 b,行数和列数由图形设备的纵横比和形状的纵横比自动确定。您可以使用 +tm_facets(ncol=2) 手动设置
      • 它对我有用。你能分享你的sessionInfo()吗?
      • 啊,和我想的一样! tmap 1.2 已于两周前在 CRAN 上发布,已修复此视口错误。
      • 非常感谢,不幸的是 CRAN 上的 OS X Mavericks 二进制文件仍在 v1.0 上。
      【解决方案3】:

      我想知道在此期间是否可以并排绘制以下示例中的 5 个地图,而无需切换到 tm_facets(ncol=5)

      data(NLD_prov, NLD_muni)
      
      tmap_mode("plot")
      tm_shape(NLD_muni) +
      tm_fill(c("pop_0_14", "pop_15_24", "pop_25_44", "pop_45_64", "pop_65plus"),
              style="kmeans", 
              palette=list("Oranges", "Greens", "Blues", "Purples", "Greys"),
              title=c("Population 0 to 14", "Population 15 to 24", "Population 25 to 44",
                      "Population 45 to 64", "Population 65 and older")) +
      tm_shape(NLD_prov) +
      tm_borders() +
      tm_format_NLD(frame = TRUE, asp=0)
      

      【讨论】:

        猜你喜欢
        • 2020-08-24
        • 2016-01-08
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        相关资源
        最近更新 更多