如何在同一页面上绘制网格图?

时间:2013-02-21 11:00:04

标签: r plot treemap r-grid

我正在使用一个使用treemap包来生成树形图的包(grid)。但是,我想将这些树图中的几个一起绘制,以便为这些图添加different color schemestmPlot函数使用grid.newpage函数清除图形窗口。我没有找到保存grid.newpage对象的方法,就像ggplot2个对象一样。有没有办法将几个grid.newpage对象绘制到同一个窗口?

## Example

library(treemap)

# load Gross national income data
data(GNI2010)

size <- aggregate(GNI ~ continent, GNI2010, sum)
size <- size[with(size, order(GNI, decreasing = T)),]

cont <- size$continent

widths <- c(sum(size[c(1,3,5),]$GNI),
sum(size$GNI) - sum(size[c(1,3,5),]$GNI))

heights <- c(sum(size[c(1,2),]$GNI),
sum(size[c(3,4),]$GNI),
sum(size[c(5,6),]$GNI))

palettes <- c("Greens", "Blues", "Reds", "Oranges", "Purples", "Greys")

i <- 1 # This is to be replaced by for loop

x <- subset(GNI2010, continent == cont[i], cex = 5)

# create treemap

layout(matrix(1:6, 3, byrow = TRUE), widths = widths, heights = heights)
x1 <- tmPlot(x,
index=c("iso3"),
vSize="population",
vColor="GNI",
type="value", title = "", 
position.legend = "none",
palette = palettes[i])
grid.text(cont[i], 0.5, 0.5, gp=gpar(fontsize=20, font = 2, col = "white"))

## x1 is does not make a plot as such and tmPlot overwrites layout

据我所知,我根据GNI总和来扩展图表的解决方案是不对的。一旦我弄清楚如何在同一个窗口中绘制这些树图,我可能会在稍后提出另一个问题。

编辑:我认为这个问题的答案是“没有”。目前你不能按名称保存grid.newpage对象,也不能在页面上保存其中的几个,因为功能“擦除当前设备或移动到新页面”,如description中所述。但是,可以找到解决方法。 tmPlot软件包目前(截至2013年3月23日)不支持viewport,但开发版本支持{{1}}。

2 个答案:

答案 0 :(得分:2)

感谢您的提问。 tmPlot的输出确实不是保存的图。

在下一次更新中,我将添加参数vp,通过该参数可以指定视口进行绘制。只有在未指定的情况下,才会调用grid.newpage。

更新:您可以在https://github.com/mtennekes/treemap

检查并测试开发版本

应用Bryan Hanson的例子:

vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))
tmPlot(GNI2010,
  index="continent",
  vSize="population",
  vColor="GNI",
  type="value",
  vp = vplayout(1,1))
tmPlot(GNI2010,
  index=c("continent", "iso3"),
  vSize="population",
  vColor="GNI",
  type="value",
  vp = vplayout(1,2))

答案 1 :(得分:1)

这是一种对任何网格图形都非常灵活的方法:

vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pushViewport(viewport(layout = grid.layout(1, 2)))
print(a, vp = vplayout(1,1))
print(b, vp = vplayout(1,2))

ab是您保存的绘图对象。因此,请提前单独测试每个绘图,将它们保存为a, b, ...,然后按上图绘制它们。

哦,如果tmPlot始终grid.newpage,那么请检查它是否有new.page参数,您可以将其设置为FALSE,或制作副本功能并注释掉newpage