I have plotted a heat map with imshow, but I can't get the x tick labels to be center aligned even though I made ha='center'
.
Here is my code:
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)
Can someone help me find the error?
However there is no direct way to center the labels between ticks. To fake this behavior, one can place a label on the minor ticks in between the major ticks, and hide the major tick labels and minor ticks. Here is an example that labels the months, centered between the ticks.
xticks() Function. The annotate() function in pyplot module of matplotlib library is used to get and set the current tick locations and labels of the x-axis.
The example below shows that the alignment setting is not too difficult. It is possible that you have some interfering commands before the ht_ax.set_xticklabels
call; and in particular, manipulating an axis before the call to imshow
rather than after might not have the desired response, since imshow
, like many/most plotting commands, includes a basic configuration of the axes.
Can you strip back much of your configuration?
# 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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With