2017-10-25 2 views
0

Ich möchte Leerraum in meiner Figur minimieren. Ich habe eine Reihe von Sub-Plots, wo vier Plots ihre y-Achse teilen und das letzte Plot eine separate Achse hat. Es gibt keine Labels oder Tickletiketten für die gemeinsamen Achsenmittelfelder.anpassen Matplotlib Subplot Abstand nach Tight_layout

tight_layout schafft viel Leerraum zwischen den mittleren Plots, als ob man Platz für Tick-Labels und Ylabels lassen würde, aber ich würde lieber die Subplots dehnen. Ist das möglich?

import matplotlib.gridspec as gridspec 
import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

fig = plt.figure() 
gs = gridspec.GridSpec(1, 5, width_ratios=[4,1,4,1,2]) 

ax = fig.add_subplot(gs[0]) 
axes = [ax] + [fig.add_subplot(gs[i], sharey=ax) for i in range(1, 4)] 

axes[0].plot(np.random.randint(0,100,100)) 
barlist=axes[1].bar([1,2],[1,20]) 

axes[2].plot(np.random.randint(0,100,100)) 
barlist=axes[3].bar([1,2],[1,20]) 

axes[0].set_ylabel('data') 

axes.append(fig.add_subplot(gs[4])) 
axes[4].plot(np.random.randint(0,5,100)) 
axes[4].set_ylabel('other data') 


for ax in axes[1:4]: 
    plt.setp(ax.get_yticklabels(), visible=False) 


sns.despine(); 
plt.tight_layout(pad=0, w_pad=0, h_pad=0); 

enter image description here

Antwort

3

w_pad = 0 Einstellung ändert nicht die Standardeinstellungen von tight_layout. Sie müssen etwas wie w_pad = -2 einstellen. Welche der folgenden Abbildung erzeugt:

enter image description here

Man könnte noch weiter gehen, -3 zu sagen, aber dann würden Sie beginnen, einige Überschneidungen mit dem letzten Grundstück zu bekommen. mit

plt.subplots_adjust(left=0.065, right=0.97, top=0.96, bottom=0.065, wspace=0.14) 

könnte eine andere Möglichkeit, sich plt.tight_layout() und setzen Sie die Grenzen zu entfernen sein, obwohl dies ein wenig von Versuch und Irrtum Prozess sein kann.

bearbeiten

Eine gut aussehende Grafik kann durch Bewegen der Zecken und die Beschriftung der letzten Handlung der rechten Seite erreicht werden. This Antwort zeigt Sie können dies tun, indem Sie:

ax.yaxis.tick_right() 
ax.yaxis.set_label_position("right") 

So für Ihr Beispiel:

axes[4].yaxis.tick_right() 
axes[4].yaxis.set_label_position("right") 

Darüber hinaus müssen Sie sns.despine() entfernen. Schließlich gibt es jetzt keine Notwendigkeit w_pad = -2 zu setzen, nur plt.tight_layout(pad=0, w_pad=0, h_pad=0)

verwenden Mit dieser folgende Abbildung erzeugt:

enter image description here

+0

Dank! das sieht besser aus, aber es gibt bereits eine erhebliche Überlappung des letzten Zeichens mit den Balken des vorletzten Feldes. Ich hatte gehofft, dass es eine Möglichkeit geben würde, nur dieses letzte Panel mehr horizontalen Raum zu geben? – jlarsch

+0

das Problem wird tatsächlich schlimmer mit größerer Schriftgröße als in meinem Beispiel – jlarsch

+0

Yeah. Ich bin mir nicht sicher, ob du das kannst (zumindest weiß ich nicht von oben). Es kann eine nicht-triviale Lösung geben, die jemand anders kennen könnte. Eine Arbeit um _could_ könnte sein, Ihre Zecken und Etiketten der letzten Handlung auf die rechte Seite zu bewegen? – DavidG

Verwandte Themen