我在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的转换之后,就显得格外鸡肋,我们可以随意画图,然后拼在一起,突破内置功能的限制。


往期精彩