2013-02-21 70 views
2

我正在使用一個包(treemap),它使用grid包生成樹形圖。但是,我想將這些樹形圖中的幾個繪製在一起,將different color schemes添加到這些圖中。 tmPlot功能使用grid.newpage函數,它清除圖形窗口。我沒有找到像ggplot2對象一樣的方法來保存grid.newpage對象。有沒有辦法將幾個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,但開發版本確實如此。

回答

2

感謝您的問題。 tmPlot的輸出實際上不是保存的圖。

在下一次更新中,我將添加參數vp,通過該參數可指定一個視口進行繪製。只有在未指定時才調用grid.newpage。

更新:您可以檢查,並在https://github.com/mtennekes/treemap

測試開發版申請布萊恩·漢森的例子:

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

這裏有一個辦法,就是對於任何網格圖形非常靈活:

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

+0

謝謝您的回答。麻煩的是我不知道如何將tmPlot保存爲對象。我知道你發送的這行代碼,它對於ggplot2對象非常有效。 – Mikko 2013-02-21 11:42:48

+1

你從哪裏得到'treeplot'?它不在CRAN上,如果有人使用Google,那麼這個名字有很多。 – 2013-02-21 11:47:26

+0

Ops ...我的意思是:'treemap'。對不起,這個錯誤。我編輯了我的問題。 – Mikko 2013-02-21 11:52:59