Python 使用matshow在行和/或列之间插入间隙

Python 使用matshow在行和/或列之间插入间隙,python,matplotlib,Python,Matplotlib,我希望在热图中的特定行/列之间引入间隙,类似于R的gaps\u row或gaps\u col参数。但是,粗略搜索后,此功能似乎不可用。我曾经考虑过通过创建不同的具有特定大小的轴来模拟这种行为,但是要使它们的位置正确是很困难的。有没有更简单的方法来模拟这个功能 例如: 在此中,有一段代码用于在matplotlib中再现上图 import matplotlib.pyplot as plt import numpy as np; np.random.seed(0) a = np.random.po

我希望在热图中的特定行/列之间引入间隙,类似于R的
gaps\u row
gaps\u col
参数。但是,粗略搜索后,此功能似乎不可用。我曾经考虑过通过创建不同的具有特定大小的轴来模拟这种行为,但是要使它们的位置正确是很困难的。有没有更简单的方法来模拟这个功能

例如:


在此

中,有一段代码用于在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的
高度/单位比率
宽度/单位比率
,例如,如果第二列沿x方向有5个数据点,而不是3个,您将调用

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

当然,需要对循环进行调整,以适应不同的节拍数等。

这非常感谢。如果列或行的大小不相等,在保留每个数据点的大小时,这是否仍然有效?如果我理解正确,您希望其中一行中有15个数据点,而不是10个?只要整行的点数相同,这就行了。列也一样。我更新了一段关于这个的答案。这真的很有帮助,谢谢。我不知道gridspec的宽高比。通过使用
add\u axes