转换UpSet图为ggplot对象
我在2018年4月份的一条推特文,https://twitter.com/guangchuangyu/status/988672880551518210,可以把UpSetR
变成ggplot
然后可以各种玩,比较我在推特文中所展示的,图上嵌入venn图、使用cowplot
拼图等。然而过了大半年,我的pull request并没有被作者接收,也就是说这功能还不存在于官方的版本中。
如果有兴趣的话,应该安装我fork的版本。
devtools::install_github("GuangchuangYu/UpSetR")
UpSetR变ggplot?
首先github版本的UpSetR
就不是直接画图,而是像《一个更好用的pheatmap》一样,输出一个对象,这就使得我的ggplotify
支持转换成为了可能,然而UpSetR
的输出是有问题,导致无法准确捕捉画图内容,于是我给它打了个补丁,如果大家有兴趣的话,可以去github围观。总之有了我这个补丁之后,就可以顺利转成ggplot
对象。
require(UpSetR)
movies <- read.csv( system.file("extdata", "movies.csv", package = "UpSetR"), header=T, sep=";" )
p1 <- upset(movies)
require(ggplotify)
g1 <- as.ggplot(p1)
用熟悉的ggplot
方式来给UpSet图加注(图)释(层)!
转成ggplot
好处很多,比如你可以随意在上面加图层,画个图,做文字标记等自然不在话下。就是嵌个小图也是随手拈来,因为我们用ggimage
包。
这里我使用yyplot
来画venn图,《ggplot2版本的维恩图》,然后使用ggimage
包来嵌图,这样就可以结合venn和upset两种图的优势,并且可以让upset图更加紧凑些。
require(yyplot)
g2 <- ggvenn(movies[, c(3,6,9,15,17)])
require(ggimage)
g3 <- g1 + geom_subview(subview = g2 + theme_void(), x=.7, y=.7, w=.6, h=.6)
方便拼图
除了上面讲的加图层更方便之外,还方便我们进行拼图。
p4 <- upset(movies,attribute.plots=list(gridrows=60,
plots=list(list(plot=scatter_plot, x="ReleaseDate", y="AvgRating"),
list(plot=scatter_plot, x="ReleaseDate", y="Watches"),
list(plot=scatter_plot, x="Watches", y="AvgRating"),
list(plot=histogram, x="ReleaseDate")), ncols = 2)
)
g4 <- as.ggplot(p4)
require(cowplot)
plot_grid(
plot_grid(
plot_grid(g1, g2, ncol=2, labels=c("A", "B")),
g3, ncol=1, labels=c("", "C")
),
g4, ncol=2, labels=c("", "D")
)
UpSetR
本身内置所提供的画一些统计图拼在一起的功能,如图D所示,现在有了我们ggplotify
的转换之后,就显得格外鸡肋,我们可以随意画图,然后拼在一起,突破内置功能的限制。
往期精彩