2014-03-19 11 views
39

This solution zu einem anderen Thread schlägt vor, mit gridspec.GridSpec anstelle von plt.subplots. Allerdings, wenn ich Achsen zwischen Nebenhandlungen teilen, ich in der Regel eine Syntax wie die folgendeGridSpec mit gemeinsamen Achsen in Python

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

verwenden Wie kann ich sharex und sharey angeben, wenn ich GridSpec verwenden?

Antwort

40

Zunächst einmal gibt es eine einfachere Problemumgehung für Ihr ursprüngliches Problem, solange Sie damit einverstanden sind, etwas ungenau zu sein. Reset Nur die Top-Ausdehnung der Handlungsstränge auf den Standard nach Aufruf tight_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() 

enter image description here


jedoch Ihre Frage zu beantworten, werden Sie die Handlungsstränge zu einem etwas erstellen müssen untere Ebene, um gridspec zu verwenden. Wenn Sie das Ausblenden von gemeinsamen Achsen wie subplots replizieren möchten, müssen Sie das manuell tun, indem Sie das sharey-Argument zu Figure.add_subplot verwenden und die doppelten Ticks mit plt.setp(ax.get_yticklabels(), visible=False) ausblenden.

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() 

enter image description here

7

Sowohl Joe Auswahl gab mir einige Probleme: Die ehemaligen, im Zusammenhang mit dem direkten Einsatz von figure.tight_layout statt figure.set_tight_layout() und letzteren mit einigen Backends (UserWarning: Tight_layout: Zurückfallen in den Aggendarender). Aber Joes Antwort hat mir definitiv den Weg zu einer weiteren kompakten Alternative geebnet. Dies ist das Ergebnis für ein Problem der Nähe des OPs ein:

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() 

enter image description here

Verwandte Themen