将matplotlib热图的刻度标签居中对齐
我用 imshow 画了一个热图,但我发现 x 轴的刻度标签没有居中对齐,尽管我已经设置了 ha='center'
。
这是我的代码:
font= mpl.rcParams['font.size']=8.0
lineWidth= mpl.rcParams['lines.linewidth']= 1.0
absolute_max=abs(max_num)
absolute_min=abs(min_num)
cb_boundary=max(absolute_max,absolute_min)
tree=Phylo.read("reorder.nwk","newick")
a=1.0
cdict = {'red': ((0.0, 0.0, 0.0),
(0.25,0.0, 0.0),
(0.5, 0.8, 1.0),
(0.75,1.0, 1.0),
(1.0, 0.4, 1.0)),
'green': ((0.0, 0.0, 0.0),
(0.25,0.0, 0.0),
(0.5, 0.9, 0.9),
(0.75,0.0, 0.0),
(1.0, 0.0, 0.0)),
'blue': ((0.0, 0.0, 0.4),
(0.25,1.0, 1.0),
(0.5, 1.0, 0.8),
(0.75,0.0, 0.0),
(1.0, 0.0, 0.0))
}
plt.register_cmap(name='BlueRed', data=cdict)
norm = mpl.colors.Normalize(vmin=-3.0, vmax=3.0)
cmap = plt.get_cmap('BlueRed')
masked_array = np.ma.masked_where(full_len==np.NaN,full_len)
cmap.set_bad('green',1.0)
fig= plt.figure(figsize=(19,10))
rect_phyl = [-0.7, 0.3, 0.2, 0.6]
rect_ht = [-0.5,0.3 , 0.3, 0.6]
phyl_ax = plt.axes(rect_phyl,frameon=True)
ht_ax = plt.axes(rect_ht)
##fig.suptitle(file_handle.replace('_del.csv',''),fontsize=22)
phyl_ax.add_patch(Rectangle((8.1,17.6),6.5,16.9,edgecolor="brown", fill=False))
phyl_ax.add_patch(Rectangle((8.1,10.4),6.5,7.0,edgecolor="magenta", fill=False))
phyl_ax.add_patch(Rectangle((8.1,7.6),6.5,2.6,edgecolor="black", fill=False))
phyl_ax.add_patch(Rectangle((8.1,0.3),6.5,6.9,edgecolor="turquoise", fill=False))
fig.subplots_adjust(hspace=0,wspace=0)
Phylo.draw(tree, axes=phyl_ax, do_show=False,show_confidence=False)
ht_ax.set_xlim(0,34)
ht_ax.set_ylim(0,34)
phyl_ax.set_xlim(0,15)
divider = make_axes_locatable(ht_ax)
cbax = divider.append_axes("right", size="5%", pad=0.10)
phyl_ax.set(xlabel='',ylabel='')
plt.setp(phyl_ax.get_xticklabels(),visible=False)
plt.setp(phyl_ax.get_yticklabels(),visible=False)
plt.setp(ht_ax.get_xticklabels(),visible=True)
plt.setp(ht_ax.get_yticklabels(),visible=False)
plt.setp(phyl_ax.get_xticklines(),visible=False)
plt.setp(phyl_ax.get_yticklines(),visible=False)
plt.setp(ht_ax.get_xticklines(),visible=False)
plt.setp(ht_ax.get_yticklines(),visible=False)
img = ht_ax.imshow(masked_array, cmap=cmap, interpolation='none',aspect='auto',vmin=-cb_boundary,vmax=cb_boundary,extent=[34,0,34,0],origin='lower')
xticks=range(34)
ht_ax.xaxis.set_ticks(xticks)
ht_ax.yaxis.set_ticks(xticks)
ht_ax.grid(True, which='both')
ha = ['right', 'center', 'left']
ht_ax.set_xticklabels(txtnames,rotation=45,fontsize=8,ha=ha[1],minor=False)
plt.colorbar(img, cax=cbax)
heatmap_file=fig.savefig('/home/Desktop/heatmap/'+file_handle.replace('.csv','')+'.pdf',bbox_inches='tight',dpi=150)
有人能帮我找出问题吗?
1 个回答
14
下面的例子说明,设置对齐方式其实并不难。可能在你调用 ht_ax.set_xticklabels
之前,有一些干扰的命令。特别是,如果你在调用 imshow
之前就调整了坐标轴,可能不会得到你想要的效果,因为 imshow
和大多数绘图命令一样,会自动配置坐标轴的一些基本设置。
你能简化一下你的配置吗?
# some random data to show
I = np.random.rand(25, 35)
# and some labels that are quite long (so differences are visible)
labels = range(0, 30000, 5000)
fig, ax = plt.subplots(3, 1, num=1)
ha = 'center'
ax[0].imshow(I, interpolation='none',aspect='auto')
ax[0].set_xticklabels(labels, rotation=45, ha='left', minor=False)
ax[1].imshow(I, interpolation='none',aspect='auto')
ax[1].set_xticklabels(labels, rotation=45, ha='center', minor=False)
ax[2].imshow(I, interpolation='none',aspect='auto')
ax[2].set_xticklabels(labels, rotation=45, ha='right', minor=False)
plt.subplots_adjust(hspace=0.5)
plt.show()