2

我正在使用一个包 ( treemap),它使用grid包来生成树形图。但是,我想将其中几个树形图绘制在一起,为这些图添加不同的配色方案tmPlot函数使用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 对象,也无法将其中几个对象保存在一个页面上,因为该功能“擦除当前设备或移动到新页面”,如描述中所述。但是,可以找到解决方法。tmPlot包目前(截至 2013 年 3 月 23 日)viewport不支持 s,但开发版本支持。

4

2 回答 2

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))
于 2013-02-21T20:12:54.000 回答
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))

您保存的绘图对象在哪里a以及在哪里。b因此,提前单独测试每个图,将它们保存为a, b, ...然后按上面的方法绘制它们。

哦,如果tmPlot总是这样,grid.newpage那么检查它是否有一个new.page可以设置为的 has 参数FALSE,或者复制该函数并注释掉newpage.

于 2013-02-21T11:38:13.387 回答