pythonic生物人

CNS必备UpSet图,这样画,这样看!

本次介绍利用Python matplotlib + UpSetPlot实现CNS常客——Upset图,例如,

Image
Mayassi, T., Li, C., Segerstolpe, Å. et al. Spatially restricted immune and microbiota-driven adaptation of the gut. Nature 636, 447–456 (2024). https://doi.org/10.1038/s41586-024-08216-z

UpSet图通过柱状图结合交集指示器,系统化展示集合间的交互和交集数量,特别是在集合数量较多或关系复杂的情况下,能够有效解决Venn图重叠过多的问题,提供更加清晰直观的可视化效果。

如下图,当集合数量为5个、6个和9个时,Upset图清晰直观的效果一目了然。

Image

怎么画图:节选自教程中的第24章👉Python matplotlib保姆级教程,使用章节“3.2.15 set_venn数据集”,展示5组数据UpSet图,核心代码,

# 24.2_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author  :   公众号: pythonic生物人
@Desc    :   24.2 UpSet图
'''

from upsetplot import from_contents, plot
import matplotlib.pyplot as plt

# 数据准备
organized_data = {
    set_name: set(group['Element'])
    for set_name, group in set_venn.groupby('Set')
}
upset_data = from_contents(organized_data)  #转换为upsetplot支持的数据格式

# 绘图
upset_plot = plot(
    upset_data,  # 传入数据,创建UpSet图
    subset_size='count',  # 显示子集大小,'count'表示显示每个交集的数量
    show_counts=True,  # 显示每个交集的计数
    #show_percentages='{:.1%}',  # 注释掉的代码:显示百分比,'{:.1%}'表示显示为百分比,保留一位小数
    sort_by="cardinality",  # 按交集大小排序,'cardinality'表示按交集元素的数量排序
    sort_categories_by="-cardinality",  # 按原集合大小排序,"-cardinality"表示按集合大小倒序排序
    facecolor="#b1283a")  # 设置UpSet图的背景颜色,"#006a8e"是深蓝色

#个性化设置
upset_plot["intersections"].set_ylabel("集合交集大小")  #设置右上图y轴标题
upset_plot["totals"].set_xlabel("原集合大小")  #设置左图x轴标题

plt.rcParams['figure.dpi'] = 300
plt.title("UpSet图", fontsize=15, y=1.1) #设置标题
plt.gca().grid(False)
plt.gcf().patch.set_edgecolor('gray')  # 设置边框颜色为灰色
plt.gcf().patch.set_linewidth(0.8)  # 设置边框宽度

plt.show()

Image

怎么看图:左半部分是这5组集合数据数量的柱状图,右边下半部分是这些集合数据的交集指示器,有颜色的点的连线就代表有交集,右边上半部分就代表这个交集的数量的柱状图。

如果还是不能理解,看下图,通过同效果的左侧venn图类比右侧upset图。

Image

-END-
推荐阅读:
👉Python matplotlib保姆级教程

Image

👉Python seaborn保姆级教程

Image

👇学习交流

Image