前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >最强大的upset plot包之二

最强大的upset plot包之二

作者头像
医学和生信笔记
发布2022-11-15 09:48:45
1.1K0
发布2022-11-15 09:48:45
举报
文章被收录于专栏:医学和生信笔记

前面我们已经介绍了迄今为止最强大的upsetplot包的部分内容,今天继续介绍剩下的功能,这个包绝对是目前画upset plot的最强大的R包,没有之一!

迄今为止最强大的upset plot R包,没有之一!

无论是从功能、易用性、美观度等方面,都是最强大的!

  • 调整集合面板
    • 修改标签和刻度
    • 修改geom
    • 添加标签
    • 修改位置和颜色映射
    • 隐藏set size面板
  • 调整交集矩阵面板
    • 交集矩阵条带
    • 添加标题
    • 背景色半透明
    • 交集矩阵的更多调整
  • 主题
    • 对不同的面板使用不同的主题
    • 调整默认主题
  • 高亮交集(查询query)
  • 排序
    • 按交集排序
    • 按集合排序
  • 分组
  • 高级用法
    • 拼图
    • 调整图形高度
    • 画韦恩图

调整集合面板

set_sizes用来调整左侧集合面板。

代码语言:javascript
复制
upset(
    movies, genres,
    min_size=200,
    set_sizes=upset_set_size()
)

plot of chunk unnamed-chunk-26

修改标签和刻度

支持ggplot语法

代码语言:javascript
复制
upset(movies, genres, width_ratio = 0.1, min_size = 10,
      set_sizes = (upset_set_size()+
                     theme(axis.ticks.x=element_line(), # 加刻度
                           axis.text.x=element_text(angle=90) # 改角度
                           )
                     )
      )

plot of chunk unnamed-chunk-27

修改geom

代码语言:javascript
复制
 upset(
        movies, genres, width_ratio=0.5, max_size=100, min_size=15, wrap=TRUE,
        set_sizes=upset_set_size(
            geom=geom_point(
                stat='count',
                color='blue',
                size=5,
                shape=5
            )
        )
    )

plot of chunk unnamed-chunk-28

添加标签

也是ggplot操作。

代码语言:javascript
复制
upset(
    movies, genres,
    min_size=10,
    width_ratio=0.3,
    encode_sets=FALSE,  # for annotate() to select the set by name disable encoding
    set_sizes=(
        upset_set_size()
        + geom_text(aes(label=..count..), hjust=1.1, stat='count') # 添加数字
        # 添加其他标记:
        + annotate(geom='text', label='@', x='Drama', y=850, color='white', size=3)
        + expand_limits(y=1100)
        + theme(axis.text.x=element_text(angle=90))
    )
)

plot of chunk unnamed-chunk-29

修改位置和颜色映射

代码语言:javascript
复制
upset(
    movies, genres,
    min_size=10,
    width_ratio=0.3,
    set_sizes=(
        upset_set_size(
            geom=geom_bar(
                aes(fill=mpaa, x=group),
                width=0.8
            ),
            position='right'
        )
    ),
    # 图例移到上面
    guides='over'
)

plot of chunk unnamed-chunk-30

隐藏set size面板

代码语言:javascript
复制
upset(
    movies, genres,
    min_size=10,
    set_sizes=FALSE # 隐藏面板
)

plot of chunk unnamed-chunk-31

调整交集矩阵面板

交集矩阵条带

使用upset_stripes函数调整交集中的矩阵面板。

代码语言:javascript
复制
upset(
    movies,
    genres,
    min_size=10,
    width_ratio=0.2,
    stripes=upset_stripes(
        geom=geom_segment(size=5), # 颜色条的宽度
        colors=c('cornsilk1', 'deepskyblue1', 'grey90') # 颜色条颜色
    )
)

plot of chunk unnamed-chunk-32

还可以通过相关信息进行更多设置:

假如我们有一个关于不同类型电影是否上映的信息:

代码语言:javascript
复制
genre_metadata = data.frame(
    set=c('Action', 'Animation', 'Comedy', 'Drama', 'Documentary', 'Romance', 'Short'),
    shown_in_our_cinema=c('no', 'no', 'on weekends', 'yes', 'yes', 'on weekends', 'no')
)

upset(
    movies,
    genres,
    min_size=10,
    width_ratio=0.2,
    stripes=upset_stripes(
        mapping=aes(color=shown_in_our_cinema), # 颜色映射
        colors=c(
            'yes'='green',
            'no'='red',
            'on weekends'='orange'
        ),
        data=genre_metadata
    )
)

plot of chunk unnamed-chunk-33

添加标题

给交集矩阵添加标题:

代码语言:javascript
复制
upset(movies, genres, min_size=10) + ggtitle('Intersection matrix title')

plot of chunk unnamed-chunk-34

给整幅图添加标题,需要用到wrap参数:

代码语言:javascript
复制
upset(movies, genres, min_size=10, wrap=TRUE) + 
  ggtitle('The overlap between genres')

plot of chunk unnamed-chunk-35

背景色半透明

代码语言:javascript
复制
upset(movies, genres, name='genre', width_ratio=0.1, min_size=10,
      stripes=c(alpha('grey90', 0.45), alpha('white', 0.3))
      )

plot of chunk unnamed-chunk-36

交集矩阵的更多调整

上面主要是交集矩阵背景条带的调整,下面是交集矩阵其他元素的调整,主要是使用intersection_matrix函数:

代码语言:javascript
复制
upset(
    movies, genres, name='genre', min_size=10,
    encode_sets=FALSE,  # for annotate() to select the set by name disable encoding
    matrix=(
        intersection_matrix(
            
            # 点的调整
            geom=geom_point(
                shape='square',
                size=3.5
            ),
             
            # 线的调整
            segment=geom_segment(
                linetype='dotted'
            ),
            
            # 边框颜色
            outline_color=list(
                active='darkorange3',
                inactive='skyblue'
            )
        )
        
        # 颜色映射,和上面那句代码一起看
        + scale_color_manual(
            values=c('TRUE'='orange', 'FALSE'='grey'),
            labels=c('TRUE'='yes', 'FALSE'='no'),
            breaks=c('TRUE', 'FALSE'),
            name='Is intersection member?'
        )
        
        # 坐标轴标签放在右边
        + scale_y_discrete(
            position='right'
        )
        
        # 添加文字注释
        + annotate(
            geom='text',
            label='Look here →',
            x='Comedy-Drama',
            y='Drama',
            size=5,
            hjust=1
        )
    ),
    
    # 查询交集
    queries=list(
        upset_query(
            intersect=c('Drama', 'Comedy'),
            color='red',
            fill='red',
            only_components=c('intersections_matrix', 'Intersection size')
        )
    )
)

image-20220516204920781

主题

对不同的面板使用不同的主题

代码语言:javascript
复制
upset(
    movies,
    genres,
    annotations = list(
        'Length'=list(
            aes=aes(x=intersection, y=length),
            geom=geom_boxplot(na.rm=TRUE)
        ),
        'Rating'=list(
            aes=aes(x=intersection, y=rating),
            geom=list(
                geom_jitter(aes(color=log10(votes)), na.rm=TRUE),
                geom_violin(alpha=0.5, na.rm=TRUE)
            )
        )
    ),
    min_size=10,
    width_ratio=0.1,
    themes=modifyList(
        upset_themes,
        list(Rating=theme_void(), Length=theme()) # 使用不同的主题
    )
)

plot of chunk unnamed-chunk-38

调整默认主题

修改全局主题,使用upset_default_themes

代码语言:javascript
复制
upset(
    movies, genres, min_size=10, width_ratio=0.1,
    themes=upset_default_themes(
      text=element_text(color='red')
))

plot of chunk unnamed-chunk-39

修改部分默认主题使用upset_modify_themes()

代码语言:javascript
复制
upset(
    movies, genres,
    base_annotations=list('Intersection size'=intersection_size(counts=FALSE)),
    min_size=100,
    width_ratio=0.1,
    themes=upset_modify_themes(
        list(
            'intersections_matrix'=theme(text=element_text(size=20)),
            'overall_sizes'=theme(axis.text.x=element_text(angle=90))
        )
    )
)

plot of chunk unnamed-chunk-40

高亮交集(查询query)

UpsetR中的query差不多,查询符合条件的交集,然后高亮显示。但是明显更加强大,可以精确控制在哪些面板显示,非常灵活。

代码语言:javascript
复制
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')
        )
    )
)

plot of chunk unnamed-chunk-41

排序

按交集排序

可以通过ratio或者degree等进行排序,使用sort_intersections_by参数:

代码语言:javascript
复制
upset(
    movies, genres, name='genre', width_ratio=0.1, min_size=10,
    sort_intersections_by='ratio', # 排序
    base_annotations=list(
        'Intersection size'=intersection_size(text_mapping=aes(label=!!upset_text_percentage())),
        'Intersection ratio'=intersection_ratio(text_mapping=aes(label=!!upset_text_percentage()))
    )
)

plot of chunk unnamed-chunk-42

可以多个条件一起使用:

代码语言:javascript
复制
upset(movies, genres, width_ratio=0.1, 
      sort_intersections_by=c('degree', 'cardinality')) # 先degree再cardinality

plot of chunk unnamed-chunk-43

还可以通过sort_intersections参数实现升序、降序、自定义排序等。

代码语言:javascript
复制
upset(movies, genres, width_ratio=0.1, sort_intersections=FALSE)

plot of chunk unnamed-chunk-44

自定义排序:

代码语言:javascript
复制
upset(
    movies,
    genres,
    width_ratio=0.1,
    sort_intersections=FALSE,
    intersections=list(
        'Comedy',
        'Drama',
        c('Comedy', 'Romance'),
        c('Romance', 'Drama'),
        'Outside of known sets',
        'Action'
    )
)

plot of chunk unnamed-chunk-45

按集合排序

代码语言:javascript
复制
# 升序
upset(movies, genres, width_ratio=0.1, sort_sets='ascending') # 也可用FALSE

plot of chunk unnamed-chunk-46

分组

按照集合给交集分组,显示不同的颜色,

代码语言:javascript
复制
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'), # 这句代码和下面2句控制matrix的颜色
        upset_query(group='Comedy', color='orange'),
        upset_query(group='Action', color='purple'),
        upset_query(set='Drama', fill='blue'), # 这句代码和下面2句控制左侧面板的颜色
        upset_query(set='Comedy', fill='orange'),
        upset_query(set='Action', fill='purple')
    )
)

plot of chunk unnamed-chunk-47

高级用法

拼图

非常神奇,由于是支持ggplot的,所以完全支持patchwork的拼图操作!

代码语言:javascript
复制
library(patchwork)

# 百分比堆积条形图
annotations = list(
    'MPAA Rating'=list(
        aes=aes(x=intersection, fill=mpaa),
        geom=list(
            geom_bar(stat='count', position='fill')
        )
    )
)

# 构建2个数据
set.seed(0)

data_1 = movies[sample(nrow(movies), 100), ]
data_2 = movies[sample(nrow(movies), 100), ]

u1 = upset(data_1, genres, min_size=5, base_annotations=annotations)
u2 = upset(data_2, genres, min_size=5, base_annotations=annotations)

# 拼图
(u1 | u2) + plot_layout(guides='collect')

image-20220516205014238

当然是可以和其他ggplot2图形拼图的:

代码语言:javascript
复制
p1 <- ggplot(mtcars,aes(factor(cyl),mpg))+geom_boxplot(aes(fill=factor(cyl)))+
  theme_bw()

(u1 | p1) +plot_layout(ncol = 2)

image-20220516205026870

调整图形高度

对于一个带有各种组合图形的upset plot来说,它本身也是通过patchwork来拼图的,所以也可以使用patchwork调整高度。

代码语言:javascript
复制
upset(
    movies, genres, name='genre', width_ratio=0.1, min_size=100,
    annotations =list(
        'MPAA Rating'=list(
            aes=aes(x=intersection, fill=mpaa),
            geom=list(
                geom_bar(stat='count', position='fill'),
                scale_y_continuous(labels=scales::percent_format())
            )
        )
    )
) + patchwork::plot_layout(heights=c(0.5, 1, 0.5)) # 调整工作

plot of chunk unnamed-chunk-50

画韦恩图

这个功能在上面演示过了,这里就不多说了,需要注意的是,画韦恩图只支持2个或者3个集合。

OK,这就是complexUpset全部的功能,看完之后,果然如最开始所说:具有UpsetR的所有优点,且完全支持ggplot2语法!不出意外,这个包以后应该是我以后画upset plot的首选包了,功能甚至比UpsetR包还要强大,对ggplot2语法的支持,完全把其他同类型包甩在身后!

以上就是今天的内容,希望对你有帮助哦!

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

本文分享自 医学和生信笔记 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 调整集合面板
    • 修改标签和刻度
      • 修改geom
        • 添加标签
          • 修改位置和颜色映射
            • 隐藏set size面板
            • 调整交集矩阵面板
              • 交集矩阵条带
                • 添加标题
                  • 背景色半透明
                    • 交集矩阵的更多调整
                    • 主题
                      • 对不同的面板使用不同的主题
                        • 调整默认主题
                        • 高亮交集(查询query)
                        • 排序
                          • 按交集排序
                            • 按集合排序
                            • 分组
                            • 高级用法
                              • 拼图
                                • 调整图形高度
                                  • 画韦恩图
                                  领券
                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档