前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高级的交集可视化工具--ComplexUpset!

高级的交集可视化工具--ComplexUpset!

作者头像
作图丫
发布2022-03-29 11:36:16
1.2K0
发布2022-03-29 11:36:16
举报
文章被收录于专栏:作图丫

导语

GUIDE ╲

ComplexUpset是一个应用于复杂的多个数据集合可视化的R语言包。

背景介绍

对于集合的可视化,我们第一反应想到的往往是韦恩图,韦恩图本身在集合数目较少的情况下是非常适用的,但是一旦集合数目较多,并且想要展示的数据维度复杂,仅仅通过韦恩图去可视化是不能完全展示数据内容的。

今天小编在这里就给大家介绍一个非常棒的集合可视化R包--ComplexUpset,它在实现集合可视化方面具有非常强大的优势!

R包安装

代码语言:javascript
复制
BiocManager::install("ComplexUpset")
library(ggplot2)
library(ComplexUpset)
#数据展示
library(ggplot2movies)
movies = as.data.frame(ggplot2movies::movies)
head(movies, 3)
代码语言:javascript
复制
genres = colnames(movies)[18:24]
genres
movies[genres] = movies[genres] == 1
t(head(movies[genres], 3))

movies[movies$mpaa == '', 'mpaa'] = NA
movies = na.omit(movies)
#设置绘图区域函数
set_size = function(w, h, factor=1.5) {
    s = 1 * factor
    options(
        repr.plot.width=w * s,
        repr.plot.height=h * s,
        repr.plot.res=100 / factor,
        jupyter.plot_mimetypes='image/png',
        jupyter.plot_scale=1
    )
}

可视化展示

01

基本用法

函数有两个必需参数:

第一个参数是一个dataframe,包含group的指标变量和协变量,

第二个参数指定一个列表,其中列的名称表示样本的标签。

代码语言:javascript
复制
upset(movies, genres, name='genre', width_ratio=0.1)

可以通过设置min_size函数筛选最小的集合水平,例如设置min_size=10,将关注至少有10个数据的集合。

代码语言:javascript
复制
upset(movies, genres, name='genre', width_ratio=0.1, min_size=10, wrap=TRUE, set_sizes=FALSE)
+ ggtitle('Without empty groups (Short dropped)')
+    #通过patchwork实现拼图
  upset(movies, genres, name='genre', width_ratio=0.1, min_size=10, keep_empty_groups=TRUE, wrap=TRUE, set_sizes=FALSE)
+ ggtitle('With empty groups')

韦恩图的区域选择:

实例:给定三组数据A、B、C,通过韦恩图展示结果。

代码语言:javascript
复制
abc_data = create_upset_abc_example()

abc_venn = (
    ggplot(arrange_venn(abc_data))
    + coord_fixed()
    + theme_void()
    + scale_color_venn_mix(abc_data)
)
##设置具体绘图的参数
(
    abc_venn
    + geom_venn_region(data=abc_data, alpha=0.05)
    + geom_point(aes(x=x, y=y, color=region), size=1)
    + geom_venn_circle(abc_data)
    + geom_venn_label_set(abc_data, aes(label=region))
    + geom_venn_label_region(
        abc_data, aes(label=size),
        outwards_adjust=1.75,
        position=position_nudge(y=0.2)
    )
    + scale_fill_venn_mix(abc_data, guide=FALSE)
)

通过定义一个highlight函数对特定区域进行选择。

代码语言:javascript
复制
set_size(6, 6.5)
simple_venn = (
    abc_venn
    + geom_venn_region(data=abc_data, alpha=0.3)
    + geom_point(aes(x=x, y=y), size=0.75, alpha=0.3)
    + geom_venn_circle(abc_data)
    + geom_venn_label_set(abc_data, aes(label=region), outwards_adjust=2.55)
)
#设置highlight函数
highlight = function(regions) scale_fill_venn_mix(
    abc_data, guide=FALSE, highlight=regions, inactive_color='NA'
)

(
    (#选择A-B交集,下方选择A-B交集和A-B-C交集
        simple_venn + highlight(c('A-B')) + labs(title='Exclusive intersection of A and B')
        | simple_venn + highlight(c('A-B', 'A-B-C')) + labs(title='Inclusive intersection of A and B')
    ) /
    (#选择对应集合
        simple_venn + highlight(c('A-B', 'A', 'B')) + labs(title='Exclusive union of A and B')
        | simple_venn + highlight(c('A-B', 'A-B-C', 'A', 'B', 'A-C', 'B-C')) + labs(title='Inclusive union of A and B')
    )
)

展示全部关联:

代码语言:javascript
复制
set_size(8, 3)
upset(
    movies, genres,
    width_ratio=0.1,
    min_size=10,
    mode='inclusive_union',
    base_annotations=list('Size'=(intersection_size(counts=FALSE, mode='inclusive_union'))),
    intersections='all',
    max_degree=3
)

02

为交集图添加更加丰富的注释

我们可以使用以下三种方法添加多个注释:

代码语言:javascript
复制
upset(
  movies,
  genres,
  annotations = list(
    #第一种方法:通过列表
    'Length'=list(
      aes=aes(x=intersection, y=length),
      # 如果您想添加多几何图形,可以提供一个列表
      geom=geom_boxplot(na.rm=TRUE)
    ),
    #第二种方法:使用ggplot2
    'Rating'=(
      ggplot(mapping=aes(y=rating))
      + geom_jitter(aes(color=log10(votes)), na.rm=TRUE)
      + geom_violin(alpha=0.5, na.rm=TRUE)
    ),
    #第三种方法:使用`upset_annotate`
    'Budget'=upset_annotate('budget', geom_boxplot(na.rm=TRUE))
  ),
  min_size=10,
  width_ratio=0.1
)

还可以使用条形图演示分类变量比例的差异:

代码语言:javascript
复制
set_size(8, 5)

upset(
    movies,
    genres,
    annotations = list(
        'MPAA Rating'=(
            ggplot(mapping=aes(fill=mpaa))
            + geom_bar(stat='count', position='fill')
            + scale_y_continuous(labels=scales::percent_format())
            + scale_fill_manual(values=c(
                'R'='#E41A1C', 'PG'='#377EB8',
                'PG-13'='#4DAF4A', 'NC-17'='#FF7F00'
            ))
            + ylab('MPAA Rating')
        )
    ),
    width_ratio=0.1
)

颜色填充:

代码语言:javascript
复制
set_size(8, 3)
upset(
  movies,
  genres,
  base_annotations=list(
    'Intersection size'=intersection_size(
      counts=FALSE,
      mapping=aes(fill=mpaa)
    )
  ),
  width_ratio=0.1
)

展示百分比

代码语言:javascript
复制
set_size(8, 6)
upset(
  movies, genres, name='genre', width_ratio=0.1, min_size=10,
  base_annotations=list(
    # with manual aes specification:
    'Intersection size'=intersection_size(text_mapping=aes(label=paste0(round(
      !!get_size_mode('exclusive_intersection')/!!get_size_mode('inclusive_union') * 100
    ), '%'))),
    # using shorthand:
    'Intersection ratio'=intersection_ratio(text_mapping=aes(label=!!upset_text_percentage()))
  )
)

03

其他设置

条纹颜色设置:

代码语言:javascript
复制
set_size(6, 4)
upset(
    movies,
    genres,
    min_size=10,
    width_ratio=0.2,
    stripes=c('cornsilk1', 'deepskyblue1')
)

将颜色设置为白色以禁用条纹:

代码语言:javascript
复制
set_size(6, 4)
upset(
    movies,
    genres,
    min_size=10,
    width_ratio=0.2,
    stripes='white'
)

特殊标记:

使用set或intersect(而不是两者)指定要特殊显示的内容:-set将标记对应的条形图,-intersect将标记所有元素。

代码语言:javascript
复制
set_size(8, 6)

upset(
    movies, genres, name='genre', width_ratio=0.1, min_size=10,
    annotations = list(
        'Length'=list(
            aes=aes(x=intersection, y=length),
            geom=geom_boxplot(na.rm=TRUE)
        )
    ),
    queries=list(
        upset_query(
            intersect=c('Drama', 'Comedy'),
            color='red',
            fill='red',
            only_components=c('intersections_matrix', 'Intersection size')
        ),
        upset_query(
            set='Drama',
            fill='blue'
        ),
        upset_query(
            intersect=c('Romance', 'Comedy'),
            fill='yellow',
            only_components=c('Length')
        )
    )
)

对集合进行排序:

代码语言:javascript
复制
set_size(8, 3)
#按照参数degree排序
upset(movies, genres, width_ratio=0.1, sort_intersections_by='degree')

还可以设置多个排序参数

代码语言:javascript
复制
set_size(8, 3)
#按照两个参数degree, cardinality排序
upset(movies, genres, width_ratio=0.1, sort_intersections_by=c('degree', 'cardinality'))

对集合分类:group_by

按照数据对应的set不同对集合进行分类

代码语言:javascript
复制
set_size(8, 3)

upset(
  movies, c("Action", "Comedy", "Drama"),
  width_ratio=0.2,
  group_by='sets',
  queries=list(
    upset_query(
      intersect=c('Drama', 'Comedy'),
      color='red',
      fill='red',
      only_components=c('intersections_matrix', 'Intersection size')
    ),
    upset_query(group='Drama', color='blue'),
    upset_query(group='Comedy', color='orange'),
    upset_query(group='Action', color='purple'),
    upset_query(set='Drama', fill='blue'),
    upset_query(set='Comedy', fill='orange'),
    upset_query(set='Action', fill='purple')
  )
)

小编总结

ComplexUpset包作为最新的韦恩图绘制工具,不仅能实现UpSetR的功能,还能够使用ggplot2的参数进行扩展,在绘图方面函数相对来说比较简单,非常值得大家学习哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作图丫 微信公众号,前往查看

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

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

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