# [Matplotlib-users] Unusual layout (GridSpec?)

Eric Firing efiring at hawaii.edu
Thu Sep 19 18:57:53 EDT 2019

```Evidently mailing lists like this are crippled by not being able to
handle attachments.  Here is the script inline:
=================================

import numpy as np
import matplotlib.pyplot as plt

def axes_inches(fig, rect, **kw):
"""
Wrapper for Figure.add_axes in which *rect* is given in inches.
The translation to normalized coordinates is done immediately
based on the present figsize.

*rect* is left, bottom, width, height in inches

"""

fw = fig.get_figwidth()
fh = fig.get_figheight()
l, b, w, h = rect
relrect = [l / fw, b / fh, w / fw, h / fh]
return ax

# We will assume that the x and y data limits all start with 0.

# The actual data limits:
xranges = np.array([[0, 15], [0, 25], [0, 23]])
yranges = np.array([[0, 0.5], [0, 0.3], [0, 0.2]])

xmranges = xranges + np.array([-0.5, 0.5])
ymranges = yranges + np.array([-0.05, 0.05])

# Scales in data units per inch:
xscale = 10  # so the max, 25, is 2.5 inches
yscale = 0.1 # so the max, 0.5, is 5 inches

# Separation in inches:
xsep = 0.4

# Force the y tick locations:
yticks = np.arange(0, 0.501, 0.1)

fig = plt.figure(figsize=(8.5, 7))
axs = []
left, bottom = 0.5, 0.5  # Starting point in inches.
for xm, ym in zip(xmranges, ymranges):
w = (xm - xm) / xscale
h = (ym - ym) / yscale
ax = axes_inches(fig, (left, bottom, w, h))
ax.set_xlim(xm)
ax.set_ylim(ym)
ax.set_yticks(yticks[yticks < ym[-1]])
axs.append(ax)
left += (xsep + w)

plt.show()

============================
Eric

On 2019/09/19 10:39 AM, Paul Hobson wrote:
> I don't think I understand your problem fully, but a GridSpec sounds
> like it'll fit the bill. We have a tutorial on it at our website. You'll
> probably get the most mileage out of the width_ratios and height_ratios
> parameters:
> https://matplotlib.org/tutorials/intermediate/gridspec.html
>
> On Thu, Sep 19, 2019 at 12:02 PM Bruno Pagani
> <bruno.pagani at astrophysics.eu <mailto:bruno.pagani at astrophysics.eu>> wrote:
>
>     Hi there,
>
>     I’m trying to combine three graphs into one, but with some specific
>     constraints on the layout. The three graphs are having the same x and y
>     variables, but not over the same span. Each graph size should reflects
>     that (e.g. if a change of 1 on the x axis is 1 cm on one graph, so
>     should it be for the other ones). Also, I’d like the y label and ticks
>     labels to be shared amongst the three graphs. Same goes for the colorbar
>     (those are scatter plots) and the legend.
>
>     Attached are the three figures (.pdf), and what the combined version
>     should look like (target.png, but here it was obtained by removing parts
>     by hand and stretching everything to fit).
>
>     Below is some minimal code to produce three similarly looking graphs, if
>     someone has an idea (GridSpec?) for this, I should be able to adapt it
>     to my actual code:
>
>     import matplotlib.pyplot as plt
>     import numpy as np
>
>     plt.scatter(np.repeat(np.linspace(0,3.5,15)[:,None],11,axis=1),np.repeat(np.linspace(0,0.5,11)[None,:],15,axis=0),c=np.random.random((15,11)),label="Some
>     label")
>
>     plt.scatter(np.repeat(np.linspace(0,6,25)[:,None],11,axis=1),np.repeat(np.linspace(0,0.5,11)[None,:],25,axis=0),c=np.random.random((25,11)),marker='*',label="Some
>     other label")
>
>     plt.scatter(np.repeat(np.linspace(0,11,23)[:,None],11,axis=1),np.repeat(np.linspace(0,0.5,11)[None,:],23,axis=0),c=np.random.random((23,11)),marker='D',label="Yet
>     another label")
>
>     Regards,
>     Bruno
>
>     _______________________________________________
>     Matplotlib-users mailing list
>     Matplotlib-users at python.org <mailto:Matplotlib-users at python.org>
>     https://mail.python.org/mailman/listinfo/matplotlib-users
>
>
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users at python.org
> https://mail.python.org/mailman/listinfo/matplotlib-users
>

```