2017-06-10 1 views
0

Ich möchte die tight_layout() Funktion in Matplotlib ignorieren Anmerkungen haben. Als Beispiel ist dies ein Grundstück mit tight_layout:Matplotlibs: vermeiden Sie Anmerkungen zur Größenänderung Abbildung

fig = plt.figure() 
fig.patch.set_facecolor('grey') 

ax1 = plt.subplot(221) 
ax2 = plt.subplot(223) 
ax3 = plt.subplot(122) 

def example_plot(ax, fontsize=12): 
    ax.plot([1, 2]) 
    ax.locator_params(nbins=3) 
    ax.set_xlabel('x-label', fontsize=fontsize) 
    ax.set_ylabel('y-label', fontsize=fontsize) 
    ax.set_title('Title', fontsize=fontsize) 

example_plot(ax1) 
example_plot(ax2) 
example_plot(ax3) 

plt.tight_layout() 

plt.annotate('a)', xy=(0, 1), xycoords='figure fraction', ha='left', va='top') 
plt.annotate('b)', xy=(0, 0.5), xycoords='figure fraction', ha='left', va='top') 
plt.annotate('c)', xy=(0.5, 1), xycoords='figure fraction', ha='left', va='top') 

enter image description here

enter image description here

Die Figur scheint in der Größe erhöht wird (nach links und oben) Platz für die Anmerkungen zu machen (die Markierungen gehen nicht bis zum Rand). Ich möchte jedoch, dass die Anmerkungen auf der Abbildung ohne Neuanordnung hinzugefügt werden. Kann ich irgendwie tight_layout diese Anmerkungen ignorieren?


Edit: Es ist eigentlich kein Problem der tight_layout sich herausstellt. Auch ohne tight_layout diese Änderung der Größe des Grundstücks Aufruf geschieht:

enter image description here

enter image description here

Allerdings, wenn ich das gleiche auf einem anderen Computer versuchen, das erwartete Verhalten (kein Resizing) passiert. Beide Systeme führen matplotlib 2.0.0 und ipython aus.

+0

Es ist unklar, was Sie fragen. Die Figur mit und ohne Anmerkungen ist genau gleich. Das ist eigentlich klar, wenn man sich den Code anschaut, "Tight_layout" heißt ** bevor ** die Anmerkungen hinzugefügt werden, so dass es nicht einmal weiß, ob sie da sind oder nicht. – ImportanceOfBeingErnest

+0

Ihr Kommentar hat mir klar gemacht, dass 'tight_layout' nicht das Problem ist. Auch ohne die Figur wird die Größe geändert. Verwirrend, auf einem anderen Computer mit der gleichen Version von Matplotlib bekomme ich das Verhalten, das Sie beschreiben. – erik

Antwort

1

Ich denke, Sie sehen das aus der falschen Richtung. Vor allem gibt es kein "Problem". Alles funktioniert wie erwartet.

tight_layout ändert nicht die Größe der Figur. Es wird lediglich die Elemente innerhalb der Figur neu angeordnet, um den verfügbaren Platz besser zu nutzen.

Was Sie sehen, ist ein Effekt der gespeicherten Figur cropped wegen der Einstellung bbox_inches="tight". Dies geschieht, weil das %matplotlib inline Backend eine gespeicherte Version der Figur zeigt. Das Bild wird so von der Originalfigur geschnitten, dass das gespeicherte Bild alle Elemente in der Leinwand enthält.
Das angezeigte Bild ist daher normalerweise kleiner als das Original.

Wenn Sie jedoch einige Etiketten in die Nähe der Figurkante legen, kann die Figur nicht beschnitten werden, da sonst die Etiketten abgeschnitten werden. Dies kann so aussehen, als sei die Figur im Vergleich zu dem Fall ohne Etiketten gewachsen. Wie jedoch erläutert, wird die Figur in Wirklichkeit nicht abgeschnitten.

Eine Lösung, falls erforderlich, ist natürlich, die Etiketten weiter weg von der Figurkante zu positionieren, so dass der Algorithmus mehr von der Figur zuschneiden kann.

+0

Das verdeutlicht all meine Verwirrung. – erik

0

Offenbar ist dies ein spezifisches Problem, wenn %matplotlib inline verwendet wird. Wenn ich auf %matplotlib notebook umschalte, ist alles in Ordnung.

Verwandte Themen