【问题标题】:Inserting gaps between rows and/or columns with matshow使用 matshow 在行和/或列之间插入间隙
【发布时间】:2017-04-14 00:36:20
【问题描述】:

我希望在热图中的特定行/列之间引入间隙,类似于 R 的 pheatmap gaps_rowgaps_col 参数。但是,粗略搜索后,此功能似乎不可用。我考虑过通过创建具有特定大小的不同轴来模拟这种行为来模拟它,但要正确放置它们会很棘手。有没有更简单的方法可以模拟这个功能?

例如:

来自question

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这是在matplotlib中重现上图的代码。

    import matplotlib.pyplot as plt
    import numpy as np; np.random.seed(0)
    
    a = np.random.poisson(lam=5, size=(10*5, 4*3))
    
    fig, axes = plt.subplots(nrows=5, ncols=4+1, figsize=(6.5,7),
                             gridspec_kw={"width_ratios":4*[1] + [0.2]})
    
    kw = dict(aspect="auto",vmin=a.min(), vmax= a.max())
    for i in range(5):
        for j in range(4):
            im = axes[i,j].imshow(a[10*i:10*i+10,3*j:3*j+3], **kw )
            axes[i,j].tick_params(axis=u'both', which=u'both',length=0)
            axes[i,j].set_xticklabels([])
            axes[i,j].set_yticklabels([])
    
    ylabels=["gene {:02d}".format(i+1) for i in range(50)]
    xlabels=["treatment {:02d}".format(i+1) for i in range(12)]
    clabels=["{:02d}".format(i+1) for i in range(5)]
    for i in range(5):
        axes[i,4].set_facecolor(plt.cm.Set2(i/8.))
        axes[i,4].text(0.5,.5, clabels[i], rotation=-90, color="w",
                       transform=axes[i,4].transAxes,
                       ha="center", va="center", fontweight="bold", fontsize=9)
        axes[i,4].tick_params(axis=u'both', which=u'both',length=0)
        axes[i,4].set_xticklabels([])
        axes[i,4].set_yticklabels([])
        axes[i,0].set_yticks(range(10))
        axes[i,0].set_yticklabels(ylabels[i*10:i*10+10], fontsize=7)
    
    for j in range(4):
        axes[4,j].set_xticks(range(3))
        axes[4,j].set_xticklabels(xlabels[j*3:j*3+3], fontsize=9, rotation=90)
    axes[4,4].set_xticks([0.5])
    axes[4,4].set_xticklabels(["category"], fontsize=9, rotation=90, fontweight="bold")    
    
    cax = fig.add_axes([0.9,0.5,0.03,0.44])
    fig.colorbar(im, cax=cax) 
    
    
    plt.subplots_adjust(bottom=0.2, top=0.94, right=0.86)   
    plt.show()
    

    如果不是所有的行或列都具有相同数量的数据点,但如果数据点在一行或一列上相同,则此解决方案仍然有效。然后,您需要调整 gridspec 的 height_ratioswidth_ratios,例如如果第二列沿 x 方向有 5 个数据点而不是 3 个,则您将调用

    gridspec_kw={"width_ratios":[3,5,3,3,1]}
    

    当然,循环需要适应不同的滴答数等。

    【讨论】:

    • 非常感谢。如果列或行的大小不相等,在保留每个数据点的大小的同时这仍然有效吗?
    • 如果我理解正确,你想拥有例如其中一行中有 15 个数据点而不是 10 个?只要整行具有相同数量的点,这将起作用。列也一样。我用一段关于这个的段落更新了答案。
    • 这真的很有帮助,谢谢。我不知道 gridspec 的宽度和高度比。我一直在通过使用add_axes 手动添加每个轴来绘制这样的图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 2015-10-15
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    相关资源
    最近更新 更多