前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」ggplotify——连接各类R图形

「R」ggplotify——连接各类R图形

作者头像
王诗翔呀
发布2020-07-06 17:07:52
1.4K0
发布2020-07-06 17:07:52
举报
文章被收录于专栏:优雅R优雅R

在作图的时候想拼接不同的图形对象,如pheatmap 包的热图、ggplot2 对象以及 base 图形等。这里找到了Y叔的ggplotify包,以下是对 Vignette 的翻译,以帮助自己理解用法,也希望读者受益。

查看源代码发现仅仅 4 个文件,加起来 100 多行代码的样子居然能有如此神效,有空一定要读源码学习下~

grid

代码语言:javascript
复制
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进行图形嵌入。

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
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包将所有的图形组合起来。

代码语言:javascript
复制
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])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • grid
  • ggplot2
  • 图形排列
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档