当前位置:  开发笔记 > 编程语言 > 正文

并排绘制2个tmap对象

如何解决《并排绘制2个tmap对象》经验,为你挑选了1个好方法。

例:

我想并排绘制两个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)

plot1并且plot2可以作为单个独立地块正常工作:

问题:

我在将两个图并排放置时遇到问题。我试过了:

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 

Martijn Tenn.. 5

好问题!

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)

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



1> Martijn Tenn..:

好问题!

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)

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

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有