我有一个用于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不是质数,但是我试图证明即使我的问题通常是质数,但也不是质数),我明白了怪物:

 

有谁知道如何解决这个问题?

最佳答案

只需添加:

plt.xlim(xmax=22) #or xl
plt.ylim(ymax=51) #or yl




plt.pcolormesh(X, cmap=matplotlib.cm.RdBu_r, vmin=-5, vmax=5)


应该这样做。

关于python - Matplotlib pcolor/pcolormesh如果行数/列数是一定数目(通常是素数),则分崩离析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19124428/

10-11 20:39