GridSpec mit gemeinsam genutzten Achsen in Python

73

Diese Lösung für einen anderen Thread schlägt vor, gridspec.GridSpecanstelle von zu verwenden plt.subplots. Wenn ich jedoch Achsen zwischen Unterplots teile, verwende ich normalerweise eine Syntax wie die folgende

  fig, axes = plt.subplots(N, 1, sharex='col', sharey=True, figsize=(3,18))

Wie kann ich angeben sharexund shareywann ich es verwende GridSpec?

Amelio Vazquez-Reina
quelle

Antworten:

74

Zunächst einmal gibt es eine einfachere Problemumgehung für Ihr ursprüngliches Problem, solange Sie damit einverstanden sind, etwas ungenau zu sein. Setzen Sie nach dem Aufruf einfach die oberste Ausdehnung der Unterzeichnungen auf die Standardeinstellung zurücktight_layout :

fig, axes = plt.subplots(ncols=2, sharey=True)
plt.setp(axes, title='Test')
fig.suptitle('An overall title', size=20)

fig.tight_layout()
fig.subplots_adjust(top=0.9) 

plt.show()

Geben Sie hier die Bildbeschreibung ein


Um Ihre Frage zu beantworten, müssen Sie die Unterzeichnungen jedoch auf einer etwas niedrigeren Ebene erstellen, um gridspec verwenden zu können. Wenn Sie das Ausblenden gemeinsam genutzter Achsen wie subplotsfolgt replizieren möchten , müssen Sie dies manuell tun, indem Sie das shareyArgument verwenden Figure.add_subplotund die duplizierten Ticks mit ausblenden plt.setp(ax.get_yticklabels(), visible=False).

Als Beispiel:

import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure()
gs = gridspec.GridSpec(1,2)
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharey=ax1)
plt.setp(ax2.get_yticklabels(), visible=False)

plt.setp([ax1, ax2], title='Test')
fig.suptitle('An overall title', size=20)
gs.tight_layout(fig, rect=[0, 0, 1, 0.97])

plt.show()

Geben Sie hier die Bildbeschreibung ein

Joe Kington
quelle
19

Beide Entscheidungen von Joe gaben mir einige Probleme: Ersteres im Zusammenhang mit der direkten Verwendung von figure.tight_layoutanstelle von figure.set_tight_layout()und letzteres mit einigen Backends ( UserWarning: tight_layout: Zurückgreifen auf Agg-Renderer ). Aber Joes Antwort machte mir definitiv den Weg zu einer anderen kompakten Alternative frei. Dies ist das Ergebnis eines Problems in der Nähe des OP:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=1, sharex='col', sharey=True,
                               gridspec_kw={'height_ratios': [2, 1]},
                               figsize=(4, 7))
fig.set_tight_layout({'rect': [0, 0, 1, 0.95], 'pad': 1.5, 'h_pad': 1.5})
plt.setp(axes, title='Test')
fig.suptitle('An overall title', size=20)

plt.show()

Geben Sie hier die Bildbeschreibung ein

khyox
quelle