Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rotating axis text for each subplot

Tags:

matplotlib

Im trying to plot a scatter matrix. I'm building on the example given in this thread Is there a function to make scatterplot matrices in matplotlib?. Here I have just modified the code slightly to make the axis visible for all the subplots. The modified code is given below

import itertools import numpy as np import matplotlib.pyplot as plt  def main():     np.random.seed(1977)     numvars, numdata = 4, 10     data = 10 * np.random.random((numvars, numdata))     fig = scatterplot_matrix(data, ['mpg', 'disp', 'drat', 'wt'],             linestyle='none', marker='o', color='black', mfc='none')     fig.suptitle('Simple Scatterplot Matrix')     plt.show()  def scatterplot_matrix(data, names, **kwargs):     """Plots a scatterplot matrix of subplots.  Each row of "data" is plotted     against other rows, resulting in a nrows by nrows grid of subplots with the     diagonal subplots labeled with "names".  Additional keyword arguments are     passed on to matplotlib's "plot" command. Returns the matplotlib figure     object containg the subplot grid."""     numvars, numdata = data.shape     fig, axes = plt.subplots(nrows=numvars, ncols=numvars, figsize=(8,8))     fig.subplots_adjust(hspace=0.05, wspace=0.05)      for ax in axes.flat:         # Hide all ticks and labels         ax.xaxis.set_visible(True)         ax.yaxis.set_visible(True)  #        # Set up ticks only on one side for the "edge" subplots... #        if ax.is_first_col(): #            ax.yaxis.set_ticks_position('left') #        if ax.is_last_col(): #            ax.yaxis.set_ticks_position('right') #        if ax.is_first_row(): #            ax.xaxis.set_ticks_position('top') #        if ax.is_last_row(): #            ax.xaxis.set_ticks_position('bottom')      # Plot the data.     for i, j in zip(*np.triu_indices_from(axes, k=1)):         for x, y in [(i,j), (j,i)]:             axes[x,y].plot(data[x], data[y], **kwargs)      # Label the diagonal subplots...     for i, label in enumerate(names):         axes[i,i].annotate(label, (0.5, 0.5), xycoords='axes fraction',                 ha='center', va='center')      # Turn on the proper x or y axes ticks.     for i, j in zip(range(numvars), itertools.cycle((-1, 0))):         axes[j,i].xaxis.set_visible(True)         axes[i,j].yaxis.set_visible(True)     fig.tight_layout()     plt.xticks(rotation=45)     fig.show()     return fig  main() 

I cant seem to be able to rotate the x-axis text of all the subplots. As it can be seen, i have tried the plt.xticks(rotation=45) trick. But this seems to perform the rotation for the last subplot alone.

like image 594
Vignesh G Avatar asked Oct 09 '13 13:10

Vignesh G


People also ask

How do I rotate axis labels in matplotlib?

Rotate X-Axis Tick Labels in Matplotlib There are two ways to go about it - change it on the Figure-level using plt. xticks() or change it on an Axes-level by using tick. set_rotation() individually, or even by using ax.


2 Answers

Just iterate through the axes tied to the figure, set the active axes to the iterated object, and modify:

for ax in fig.axes:     matplotlib.pyplot.sca(ax)     plt.xticks(rotation=90) 
like image 100
aikramer2 Avatar answered Sep 30 '22 07:09

aikramer2


plt only acts on the current active axes. You should bring it inside your last loop where you set some of the labels visibility to True:

# Turn on the proper x or y axes ticks. for i, j in zip(range(numvars), itertools.cycle((-1, 0))):     axes[j,i].xaxis.set_visible(True)     axes[i,j].yaxis.set_visible(True)      for tick in axes[i,j].get_xticklabels():         tick.set_rotation(45)     for tick in axes[j,i].get_xticklabels():         tick.set_rotation(45) 
like image 23
Rutger Kassies Avatar answered Sep 30 '22 06:09

Rutger Kassies