2013-09-04 32 views
15

Der folgende Code gibt mir ein Diagramm mit signifikanten Margen über und unter der Figur. Ich weiß nicht, wie man die merkbaren Ränder beseitigen kann. subplots_adjust funktioniert nicht wie erwartet.Matplotlib Stellen Sie den Seitenrand ein

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(range(10),range(10)) 
ax.set_aspect('equal') 
plt.tight_layout() 

tight_layout eliminiert einen Teil der Marge, aber nicht alle von den Rändern.

Was ich wollte, ist tatsächlich das Seitenverhältnis auf jeden benutzerdefinierten Wert und die Beseitigung der Leerraum zur gleichen Zeit.

Update: Wie Pierre H. es ausdrückt, ist der Schlüssel, die Größe des Figurencontainers zu ändern. Meine Frage ist also: Könnten Sie eine Möglichkeit vorschlagen, die Größe der Figur an die Größe der Achsen mit beliebigem Seitenverhältnis anzupassen?

Mit anderen Worten, zuerst erstelle ich eine Figur und eine Achse darauf, und dann ändere ich die Größe der Achsen (zB durch Änderung des Seitenverhältnisses), was im Allgemeinen einen Teil des Figurencontainers leer lässt. In diesem Stadium müssen wir die Größe der Figur entsprechend ändern, um die Leerstelle auf dem Figurencontainer zu eliminieren.

+0

versuchen 'data = np.random.rand (15,20)' – joaquin

+1

Sie können auch 'fig.set_size_inches' verwenden, um den Aspekt der Figur auf den Aspekt Ihrer Daten einzustellen – tacaswell

+3

Wenn Sie nur daran interessiert sind die gespeicherte Figur, werfen Sie einen Blick auf 'fig.savefig ('whatever.ext', bbox_inches = 'tight')'. –

Antwort

4

Ich denke, der subplot_adjust Aufruf ist hier irrelevant, da die Anpassung von tight_layout übersteuert wird. Wie auch immer, dies ändert nur die Größe der Achsen innerhalb der Figur.

Wie tcaswell darauf hingewiesen hat, müssen Sie die Größe der Abbildung ändern. Entweder bei der Erstellung (mein Vorschlag unten) oder danach, mit fig.set_size_inches. Ich bin mit einem 1 eine Figur hier zu schaffen: durch das figsize=(6,6) Argument 1 Seitenverhältnis (natürlich 6 Zoll ist eine willkürliche Auswahl):

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure(figsize=(6,6)) 
ax = fig.add_subplot(111) 
ax.plot(range(10),range(10)) 
ax.set_aspect('equal') 
plt.tight_layout() 
+0

Ich glaube, Sie sind sehr nahe an der Antwort. Könnten Sie eine Möglichkeit vorschlagen, die Größe der Figur an die Größe der Achsen mit beliebigem Seitenverhältnis anzupassen? – wdg

+1

Ich sehe zwei Möglichkeiten: (1) (die einfachere) Einstellung der Figurgröße bei der Erstellung durch Erraten des Seitenverhältnisses * aus den Daten *. plt.figaspect ist dafür ein guter Helfer. (2) (komplizierter) mit ax.get_position(), um das Achsen-Seitenverhältnis zu messen. Letzteres erfordert etwas mehr Rechenleistung, da die Achsenposition in einem [0,1] x [0,1] relativen Koordinatenraum ausgedrückt wird. –

16

Nach Ihrem Diagramm Plotten können Sie leicht Margen auf diese Weise manipulieren: wollen

plot_margin = 0.25 

x0, x1, y0, y1 = plt.axis() 
plt.axis((x0 - plot_margin, 
      x1 + plot_margin, 
      y0 - plot_margin, 
      y1 + plot_margin)) 

Dieses Beispiel auf das Seitenverhältnis geändert werden, können Sie wie Sie wirklich wollen, oder die Ränder ändern. In anderen Stack-Overflow-Posts könnten viele Fragen zu Margen von diesem einfacheren Ansatz Gebrauch machen.

Mit freundlichen Grüßen.

+2

Nuno ... so sehr hilfreich. Ihr einfacher, lesbarer Ansatz funktioniert prächtig für mich. Ich habe diese kleine Formatierungsfunktion, die mit verschiedenen xy-Graphen arbeitet, die unterschiedliche Ausmaße für beide Achsen haben, so dass ich herausgefunden habe, dass es notwendig ist, zu schreiben, sagen wir, plot_marginx = 0.05 * (x1-x0) 'und zu setzen das vor der Zeile 'plt.axis()' ... ebenso natürlich für y. –

+0

Ist das anders als das Setzen von xlim und ylim wie bei ax.set_xlim()? –

+0

Das gleiche gilt für 'plt.set_xlim()' oder 'set_ylim()', um den Bereich der angezeigten Daten zu ändern. Das ist etwas ganz anderes als die Größe der Achse zu ändern –

26

Ich habe gerade entdeckt, wie man alle Ränder aus meinen Zahlen entfernt. Ich habe nicht mit tight_layout(), stattdessen habe ich:

import matplotlib.pyplot as plt 
fig = plt.figure(figsize=(20,20)) 
ax = plt.subplot(111,aspect = 'equal') 
plt.subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=0, hspace=0) 

Hoffnung, das hilft.

2

Sie sollten add_axes verwenden, wenn Sie das Figurenlayout genau steuern wollen. z.B.

left = 0.05 
bottom = 0.05 
width = 0.9 
height = 0.9 
ax = fig.add_axes([left, bottom, width, height]) 
0

Ich denke, was Sie brauchen, ist, und es funktioniert gut für mich.

plt.axis('tight') 

Dieser Befehl skaliert die Achse automatisch so, dass sie eng an die Daten angepasst ist. Überprüfen Sie auch die Antwort von Nuno Aniceto für eine benutzerdefinierte Achse.Die Dokumente sind in https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.axis.

Beachten Sie, dass

plt.savefig(filename, bbox_inches='tight') 

helfen Leerraum aller Figur einschließlich Etiketten zu entfernen, etc, aber nicht der Leerraum innerhalb der Achsen.

Verwandte Themen