サンプルや遺伝子の素数 (または素数ではない場合もある) がある場合、メッシュがサブプロットに適合しなくなることを除いて、非常にうまく機能する 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 が素数ではないことはわかっていますが、私の問題は通常素数に関するものですが、素数に限定されたものではないことを示そうとしています)、これを取得します。怪物:
誰もこれを修正する方法の手がかりを持っていますか?