[Matplotlib-users] Share Y-axis on Subplot with Scaling


I’m trying to do something similar to this example:

However, instead of the parasite axes being overlaid with the primary one, I’d like it to be a separate subplot that I can put different data on. (Also, I’m trying to do this with a pair of y-axes, in case that’s relevant. It’s not immediately obvious how to adjust the example to do this with y instead of x.) Ultimately I want the second y-axis to set its range to some multiple of the first. So, for example, if I set one axis to have a y range of [0,64], I’d like the second subplot to automatically adjust its range to [0,32]. (I’d also like to be able to link the x axes to adjust together as normally done with the sharex keyword.)

My first thought was to modify the lines:

ax = SubplotHost(fig, 1, 1, 1)
ax_pm = ax_kms.twin(aux_trans)

to be:

ax = SubplotHost(fig, 2, 1, 1)
ax_pm = fig.add_subplot(212, transform=aux_trans)

but the result is a TypeError: unhashable type: ‘Affine2D’.

Perhaps I’m getting transforms confused, and the transform keyword to add_subplot is used to define its location on the figure instead of how “twin” uses it to apparently scale the axes. The API just lists the keyword as expecting a type “Transform”, and mentions that it’s passed along to the Axes base class, which also just lists it as being of type “Transform”.

(aside: is there documentation for the “SubplotHost” class? I don’t see it listed here: https://matplotlib.org/3.1.1/api/_as_gen/mpl_toolkits.axes_grid1.parasite_axes.html I went looking for the documentation of the “twin” function to see if I could understand how it used the transform, but was unable to find it in about 5 minutes of looking.)

To make it a little clearer what I’m after, here’s some base code to set up an example:

import matplotlib.pyplot as plt

xdata = [1, 2, 3, 4, 5, 6]
ydata = [2, 4, 8, 16, 32, 64]
ydata2 = [y/2 for y in ydata]

fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)
ax2 = fig.add_subplot(2, 1, 2, sharex=ax1)

ax1.plot(xdata, ydata)
ax2.plot(xdata, ydata2)

ax1.set_ylim([0, 64])

ax2.set_ylim([0, 32]) # happens automagically with the previous line

It would be super convenient if one could simply pass a transform as the argument to sharey in the call to add_subplot…

Thanks for any help you might provide,