我有一个pcolormesh热图和树形图的代码非常好,除非我有一个素数(或有时不是素数)的样本和/或基因,网格不再适合子图。在玩了很多之后,我意识到这与pcolor / pcolormesh划分方块(舍入错误)的方式有关,但我对API的熟悉程度甚至还没有开始解决问题。我真的希望这个代码可以推广到所有数量的样本/顶级基因。顺便说一句,我没有单独写这个代码,它是从大量的SO问题拼凑而成的,所以谢谢你们(无论你是谁)。
import scipy
import scipy.cluster.hierarchy as hier
import scipy.spatial.distance as dist
# xl is number of patients, yl is number of genes
# slicing: array[rows,cols]
xl = 20
yl = 50
X = np.transpose(np.random.uniform(-5,5,(100,100)))
#X = np.transpose(Ximp)
X = X[0:yl,0:xl]
fig = plt.figure()
plt.subplot2grid((10,1), (0,1))
X = np.transpose(X)
distMatrix = dist.pdist(X)
distSquareMatrix = dist.squareform(distMatrix)
linkageMatrix = hier.linkage(distSquareMatrix)
dendro = hier.dendrogram(linkageMatrix)
leaves = dendro['leaves']
plt.gca().set_xticklabels([])
plt.gca().set_yticklabels([])
plt.subplot2grid((10,1), (2,0), rowspan=8)
X = np.transpose(X)
X = X[:,leaves]
plt.pcolormesh(X, cmap=matplotlib.cm.RdBu_r, vmin=-5, vmax=5)
xlabels = [item[0:2] for item in demos[0]][0:xl]
relabelx = dict(zip(range(xl),xlabels))
ylabels = glist[0:yl]
plt.xticks(arange(0.5, xl+0.5, 1))
plt.yticks(arange(0.5, yl+0.5, 1))
plt.gca().set_xticklabels([relabelx[xval] for xval in leaves])
plt.gca().set_yticklabels(ylabels)
fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
plt.colorbar(cax=cbar_ax)
plt.show()
此代码生成此图像:
但是,我将xl更改为22并将yl更改为51(是的,我知道22不是素数,但我试图表明即使我的问题通常是素数,但它并不是排他性的),并且我得到了这个怪物:
有没有人知道如何解决这个问题?
答案 0 :(得分:3)
只需添加:
plt.xlim(xmax=22) #or xl
plt.ylim(ymax=51) #or yl
后
plt.pcolormesh(X, cmap=matplotlib.cm.RdBu_r, vmin=-5, vmax=5)
应该这样做。