「r<-包|ggplot2|grid」ggplotify——連接各類R圖形

在作圖的時候想拼接不同的圖形對象,如pheatmap 包的熱圖、ggplot2 對象以及 base 圖形等。 這裏找到了Y叔的ggplotify包,以下是對 Vignette 的翻譯,以幫助自己理解用法,也希望讀者受益。

查看源代碼發現僅僅 4 個文件,加起來 100 多行代碼的樣子居然能有如此神效,有空一定要讀源碼學習下~

grid

library("grid")
library("ggplotify")
p1 <- as.grob(~barplot(1:10))
p2 <- as.grob(expression(plot(rnorm(10))))
p3 <- as.grob(function() plot(sin))
library("vcd")
data(Titanic)
p4 <- as.grob(~mosaic(Titanic))
library("lattice")
data(mtcars)
p5 <- as.grob(densityplot(~mpg|cyl, data=mtcars))

as.grob 函數接收繪製圖形的 expression、公式或者函數等。圖形可以由基礎圖形生成 (p1, p2, p3) 或者 grid (p4)。如果圖形產生了圖形對象,它可以直接用於其他 工具包latticememeUpSetR等的輸入。

因爲這裏將圖形轉換爲了grob對象,所以它兼容grid圖形系統與相關工具包。

我們現在可以使用grid.draw繪製p1p2,以及使用pushViewport進行圖形嵌入。

grid.newpage()
grid.draw(p1)
vp = viewport(x=.35, y=.75, width=.35, height=.3)
pushViewport(vp)
grid.draw(p2)
upViewport()

如果你不熟悉grid,你可以使用ggplot2去完成類似的任務。

ggplot2

所有可以轉換爲grob對象的圖形都可以使用as.ggplot函數轉換爲ggplot對象。

library(ggplot2)
p1 <- as.ggplot(~barplot(1:10)) +
    annotate("text", x = .6, y = .5,
             label = "Hello Base Plot", size = 5,
             color = 'firebrick', angle=45)
p2 <- as.ggplot(expression(plot(rnorm(10))))
p3 <- as.ggplot(function() plot(sin))
p4 <- as.ggplot(~mosaic(Titanic))
p5 <- as.ggplot(densityplot(~mpg|cyl, data=mtcars))

圖形排列

現在有了ggplot對象,我們可以利用cowplot或者patchwork包將所有的圖形組合起來。

library(cowplot)
library(colorspace)
col <- rainbow_hcl(3)
names(col) <- unique(iris$Species)
color <- col[iris$Species]
p6 <- as.ggplot(~plot(iris$Sepal.Length, iris$Sepal.Width, col=color, pch=15))
p7 <- ggplot(iris, aes(Sepal.Length, Sepal.Width, color=Species)) +
    geom_point(shape=15) + scale_color_manual(values=col, name="")
legend <- get_legend(p7)
## also able to annotate base or other plots using ggplot2
library(ggimage)
p8 <- p6 + geom_subview(x=.7, y=.78, subview=legend)
p9 <- as.ggplot(~image(volcano))
plot_grid(p1, p2, p3, p4, p5, p6, p7, p8, p9, ncol=3, labels=LETTERS[1:9])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章