Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Row Titles within a matplotlib GridSpec

I have an GridSpec defined layout with to subgrids, one is supposed to include a colorbar

import pylab as plt
import numpy as np
gs_outer = plt.GridSpec(1, 2, width_ratios=(10, 1))
gs_inner = plt.matplotlib.gridspec.GridSpecFromSubplotSpec(2, 3, gs_outer[0])
ax = []
for i in xrange(6):
    ax.append(plt.subplot(gs_inner[i]))
    plt.setp(ax[i].get_xticklabels(), visible=False)
    plt.setp(ax[i].get_yticklabels(), visible=False)
ax.append(plt.subplot(gs_outer[1]))
plt.show()

I'd now like to get for the left part a row-wise labeling like this:enter image description here

I tried to add another GridSpec into the GridSpec, but that did not work out:

import pylab as plt
import numpy as np
fig = plt.figure()
gs_outer = plt.GridSpec(1, 2, width_ratios=(10, 1))
gs_medium = plt.matplotlib.gridspec.GridSpecFromSubplotSpec(3, 1, gs_outer[0])
ax_title0 = plt.subplot(gs_medium[0])
ax_title0.set_title('Test!')
gs_row1 = plt.matplotlib.gridspec.GridSpecFromSubplotSpec(1, 3, gs_medium[0])
ax00 = plt.subplot(gs_row1[0]) # toggle this line to see the effect
plt.show()

Adding the ax00 = plt.subplot... line seems to erase the previously created axis

like image 518
MichaelA Avatar asked Nov 09 '22 22:11

MichaelA


1 Answers

Following CT Zhu comment I came up with the following answer (I don't really like it, but it seems to work)

import pylab as plt
import numpy as np
fig = plt.figure()
rows = 2
cols = 3
row_fraction = 9
row_size = row_fraction / float(rows)
gs_outer = plt.GridSpec(1,2, width_ratios=(9,1))
gs_plots= plt.matplotlib.gridspec.GridSpecFromSubplotSpec(rows * 2, cols, subplot_spec=gs_outer[0], height_ratios = rows * [1, row_size])
# Create title_axes
title_ax = []
for ta in xrange(rows):
    row_index = (ta) * 2
    title_ax.append(plt.subplot(gs_plots[row_index, :]))
# Create Data axes
ax = []
for row in xrange(rows):
    row_index = (row + 1) * 2 -1
    for col in xrange(cols):
        try:
           ax.append(plt.subplot(gs_plots[row_index, col], sharex=ax[0], sharey=ax[0]))
        except IndexError:
            if row == 0 and col == 0:
                ax.append(plt.subplot(gs_plots[row_index, col]))
            else:
                raise IndexError
    # Delete Boxes and Markers from title axes
    for ta in title_ax:
        ta._frameon = False
        ta.xaxis.set_visible(False)
        ta.yaxis.set_visible(False)
    # Add labels to title axes:
    for ta, label in zip(title_ax, ['Row 1', 'Row 2']):
        plt.sca(ta)
        plt.text(
            0.5, 0.5, label, horizontalalignment='center', verticalalignment='center')
# Add common colorbar
gs_cb = plt.matplotlib.gridspec.GridSpecFromSubplotSpec(
    1, 1, subplot_spec=gs_outer[1])
ax.append(plt.subplot(gs_cb[:, :]))

Of course labeling and ticklabels could be improved. But how to achive that is likely already explained on SO.

like image 102
MichaelA Avatar answered Nov 15 '22 11:11

MichaelA