user2667066
user2667066

Reputation: 2079

Different width subplots sharing same x-axis

I want 3 rows of subplots each of different widths, but which all share the same X-axis, such as in the rough mock-up below. How can I do this? Can I use sharex=True even in GridSpec-adjusted plots?

enter image description here

Upvotes: 0

Views: 844

Answers (2)

Jody Klymak
Jody Klymak

Reputation: 5913

You can place the axes by hand, or another method is to use an inset_axes:

import matplotlib.pyplot as plt
import numpy as np

fig, axs = plt.subplots(3, 1, constrained_layout=True, sharex=True, sharey=True)

ylim=[-3, 3]
axs[2].plot(np.random.randn(500))
axs[2].set_ylim(ylim)
xlim = axs[2].get_xlim()

ax0 = axs[0].inset_axes([300, ylim[0], xlim[1]-300, ylim[1]-ylim[0]], transform=axs[0].transData)
ax0.set_ylim(ylim)
ax0.set_xlim([300, xlim[1]])
axs[0].axis('off')

ax0.plot(np.arange(300, 500), np.random.randn(200))

ax1 = axs[1].inset_axes([150, ylim[0], xlim[1] - 150, ylim[1]-ylim[0]], transform=axs[1].transData)
ax1.set_ylim(ylim)
ax1.set_xlim([150, xlim[1]])
axs[1].axis('off')
ax1.plot(np.arange(150, 500), np.random.randn(350))
plt.show()

enter image description here

Upvotes: 1

Diziet Asahi
Diziet Asahi

Reputation: 40697

You can pass which axes to use as reference for sharing axes when you create your subplot

fig = plt.figure()
gs = matplotlib.gridspec.GridSpec(3,3, figure=fig)
ax1 = fig.add_subplot(gs[0,2])
ax2 = fig.add_subplot(gs[1,1:], sharex=ax1)
ax3 = fig.add_subplot(gs[2,:], sharex=ax1)
ax1.plot([1,5,0])

enter image description here

Upvotes: 1

Related Questions