2017-04-13 33 views
1

我希望能引入類似於R的pheatmapgaps_rowgaps_col參數的熱圖中的特定行/列之間的間隙。但是,粗略搜索後,此功能似乎不可用。我曾考慮通過創建具有特定大小的不同軸來模擬此行爲,但正確地確定其位置將會非常棘手。有沒有更簡單的方法來模擬此功能?使用matshow插入行和/或列之間的間隙

例如:

pheatmap gap example

從這question

回答

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

enter image description here

如果不是所有的行或列中具有相同數目的數據點,但如果數據點沿着一行或一列相同,該解決方案將仍然正常工作。然後您需要調整gridspec的height_ratioswidth_ratios,例如,如果第二列具有沿x方向,而不是3 5個數據點,你會打電話

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

OFG過程中的循環將需要適應佔不同數量的蜱等

+0

這是偉大的感謝。如果列或行的大小不相等,這是否仍然有效,同時保留每個數據點的大小? – GWW

+1

如果我理解正確,你想擁有一行中有15個數據點而不是10個?只要完整的行具有相同的點數,那就行得通了。相同的列。我用一段關於此的更新了答案。 – ImportanceOfBeingErnest

+0

這真的很有幫助謝謝。我不知道gridspec的寬高比。我一直在使用'add_axes'手動添加每個軸來繪製這樣的圖 – GWW