查看原文
其他

最强大的upset plot包之二

阿越就是我 医学和生信笔记 2023-06-15
关注公众号,发送R语言Python,获取学习资料!

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

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

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

  • 调整集合面板

    • 修改标签和刻度

    • 修改geom

    • 添加标签

    • 修改位置和颜色映射

    • 隐藏set size面板

  • 调整交集矩阵面板

    • 交集矩阵条带

    • 添加标题

    • 背景色半透明

    • 交集矩阵的更多调整

  • 主题

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

    • 调整默认主题

  • 高亮交集(查询query)

  • 排序

    • 按交集排序

    • 按集合排序

  • 分组

  • 高级用法

    • 拼图

    • 调整图形高度

    • 画韦恩图

调整集合面板

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

upset(
    movies, genres,
    min_size=200,
    set_sizes=upset_set_size()
)
plot of chunk unnamed-chunk-26

修改标签和刻度

支持ggplot语法

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

 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操作。

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

修改位置和颜色映射

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面板

upset(
    movies, genres,
    min_size=10,
    set_sizes=FALSE # 隐藏面板
)
plot of chunk unnamed-chunk-31

调整交集矩阵面板

交集矩阵条带

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

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

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

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

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

添加标题

给交集矩阵添加标题:

upset(movies, genres, min_size=10) + ggtitle('Intersection matrix title')
plot of chunk unnamed-chunk-34

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

upset(movies, genres, min_size=10, wrap=TRUE) + 
  ggtitle('The overlap between genres')
plot of chunk unnamed-chunk-35

背景色半透明

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函数:

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

主题

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

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

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()

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差不多,查询符合条件的交集,然后高亮显示。但是明显更加强大,可以精确控制在哪些面板显示,非常灵活。

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参数:

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

可以多个条件一起使用:

upset(movies, genres, width_ratio=0.1
      sort_intersections_by=c('degree''cardinality')) # 先degree再cardinality
plot of chunk unnamed-chunk-43

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

upset(movies, genres, width_ratio=0.1, sort_intersections=FALSE)
plot of chunk unnamed-chunk-44

自定义排序:

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

按集合排序

# 升序
upset(movies, genres, width_ratio=0.1, sort_sets='ascending'# 也可用FALSE
plot of chunk unnamed-chunk-46

分组

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

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的拼图操作!

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图形拼图的:

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调整高度。

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.510.5)) # 调整工作
plot of chunk unnamed-chunk-50

画韦恩图

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

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


以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发


欢迎扫描二维码加 QQ群 613637742


欢迎关注公众号:医学和生信笔记

医学和生信笔记,专注R语言数据分析和可视化、R在临床医学中的应用。保姆级教程带你入门R语言,主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等,细致的R包讲解让你快速掌握数据清洗及可视化!



往期回顾

可能是最适合小白的R语言和R包安装教程


复制粘贴不走样!从网页复制格式化数据到RStudio


推文汇总


不等宽条形图


机器学习算法识别结直肠癌中的免疫相关lncRNA signature

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存