2017-02-16 83 views
0

我想从tmap包中使用tm_shape()和tm_layout()在一个页面中使用grid-package中的grid.layout()绘制多个映射。我想绘制只有一个共同的图例这里显示所有地图,类似的例子:用一个常见的图例绘制类tmap的多个对象

ggplot separate legend and plot

不幸的是,TMAP不提供ggplot对象。有人知道如何做tmaps相同吗?这里是一个重复的例子:

data(World, rivers, metro) 

# creating two separate maps 
africa <- World[[email protected]$continent=='Africa',] 
asia <- World[[email protected]$continent=='Asia',] 

my.breaks <- seq(0,80,20) 

africa.map <- tm_shape(africa) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_layout(bg.color = "white", legend.text.size = 1.3, legend.width = 0.6, 
      legend.outside=TRUE, legend.outside.position = 'top', 
      legend.outside.size = .1, legend.position = c(0.8, 0.2)) 

asia.map <- tm_shape(asia) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_layout(bg.color = "white", legend.text.size = 1.3, legend.width = 0.6, 
      legend.outside=TRUE, legend.outside.position = 'top', 
      legend.outside.size = .1, legend.position = c(0.8, 0.2)) 

page.layout <- grid.layout(nrow = 8, ncol = 5, 
          widths = unit(c(1), "null"), 
          heights = unit(c(1), "null"), 
          default.units = "null", 
          respect = FALSE, 
          just = "centre") 

grid.newpage() 
pushViewport(viewport(layout = page.layout)) 
grid.text(paste('Happy Planet Index'), 
      vp = viewport(layout.pos.row = 1, layout.pos.col = 1:5),gp=gpar(fontsize=20)) 

grid.text('Africa', vp = viewport(layout.pos.row = 2, layout.pos.col = 1:2),gp=gpar(fontsize=20)) 
print(africa.map, vp=viewport(layout.pos.row = 3:6, layout.pos.col = 1:2)) 

grid.text('Asia', vp = viewport(layout.pos.row = 2, layout.pos.col = 3:5),gp=gpar(fontsize=20)) 
print(asia.map, vp=viewport(layout.pos.row = 3:6, layout.pos.col = 3:5)) 

最佳, 埃里希

+0

这绝对有可能。你能发布一个你想实现的可重复的例子吗? –

+0

谢谢Martijn!我添加了一个例子。我想要做的是只绘制两个地图的一个常见图例,最好将图例与地图分开,并在绘图区域的任何位置单独绘制,如ggplot2示例中所示。但如果你有更好的解决方案,我很高兴。 – Erich

回答

1

我不知道这是你的意思:

data(World) 

tm_shape(World) + 
    tm_polygons(c("economy", "HPI")) + 
    tm_layout(legend.outside = TRUE) 

常见的传说绘制地图之外。由于两个地图都有不同的图例,因此只有第一张地图的图例被采用。

也有使用grid.layout的方法。在这种情况下,您需要在网格视口中打印tmap地图(请参阅print.tmap),并在另一个中打印图例。

UPDATE:

只是要齐全:通常情况下,应该有办法用方面做到这一点:

data(World) 
AfAs <- World[[email protected]$continent %in% c('Africa', 'Asia'),] 
tm_shape(AfAs) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_facets(by = "continent", drop.units = TRUE, free.coords = TRUE) 

如果需要绘制2次TMAP通话,这是最方便的过程图例作为一个单独的地图,与legend.only=TRUE

africa.map <- tm_shape(africa) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_layout(legend.show = FALSE) 

asia.map <- tm_shape(asia) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_layout(legend.show = FALSE) 

legend.map <- tm_shape(africa) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_layout(legend.only = TRUE) 

grid.newpage() 
page.layout <- grid.layout(nrow = 2, ncol = 2, widths=c(.4,.6), heights=c(.6,.4)) 
pushViewport(viewport(layout = page.layout)) 

print(africa.map, vp=viewport(layout.pos.row = 1:2, layout.pos.col = 1)) 
print(asia.map, vp=viewport(layout.pos.row = 1, layout.pos.col = 2)) 
print(legend.map, vp=viewport(layout.pos.row = 2, layout.pos.col = 2)) 

UPDATE 2

图例可以用此代码放大:

legend.map <- tm_shape(africa) + 
    tm_fill("HPI",style = 'fixed',breaks = my.breaks) + 
    tm_layout(legend.only = TRUE, design.mode=TRUE, scale=2, asp=0) 

design.mode=TRUE在设计地图时非常方便。我必须将asp设置为0,因为它占用了非洲的宽高比:这是一个错误,因为当legend.only = TRUE时纵横比应该跟随设备/视口。这在devel版本中是固定的。

+0

非常感谢!这正是我正在寻找的。 – Erich

+0

但是现在你怎么在世界上让这个传说更大?我已经尝试了本书中的所有可用命令: – Erich

+0

请参阅更新二。 –