2010-07-25 9 views
8

wenn ich eine Reihe von Handlungsstränge mit einer Spalte und viele Zeilen haben, d.h .:Einstellung Höhen einzelner Nebenhandlungen in matplotlib in Python

plt.subplot(4, 1, 1) # first subplot 
plt.subplot(4, 1, 2) # second subplot 
# ... 

wie kann ich die Höhe der ersten N Nebenhandlungen einstellen? Zum Beispiel, wenn ich 4 Subplots habe, jeder in seiner eigenen Zeile, möchte ich, dass alle von ihnen die gleiche Breite haben, aber die ersten 3 Subplots kürzer sind, dh ihre y-Achsen sind kleiner und nehmen weniger vom Plot ein als die Y-Achse des letzten Plots in der Reihe. Wie kann ich das machen?

danke.

+0

Verwendung tight_layout. Dieser Link hat gute Beispiele: http://matplotlib.org/users/tight_layout_guide.html. Damit es funktioniert, müssen Sie die Größe ändern, z. 'plt.figure (figsize = (10, 1.5 * plotsToPlot))' wobei 'plotsToPlot' die Anzahl der Unterplots auf einer Figur ist. – Dilawar

+0

Verwenden Sie das [AxesGrid-Toolkit] (http://matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/overview.html#axesgrid). – vtorhonen

Antwort

3

Es gibt mehrere Möglichkeiten, dies zu tun. Die grundlegendste (und am wenigsten flexibel) Weg ist, wie etwas zu nennen:

import matplotlib.pyplot as plt 
plt.subplot(6,1,1) 
plt.subplot(6,1,2) 
plt.subplot(6,1,3) 
plt.subplot(2,1,2) 

Welche Sie so etwas wie dieses gibt: Unequal Subplots

Dies ist jedoch nicht sehr flexibel. Wenn Sie matplotlib> = 1.0.0 verwenden, schauen Sie sich GridSpec an. Es ist ziemlich nett und es ist eine viel flexiblere Art, Nebenhandlungen auszulegen.

+1

Ich glaube, diese Antwort zu suboptimal, sollte die Antwort unten die akzeptierte sein – NameOfTheRose

+0

@ user2422503 - Beachten Sie dieses Datum und die Referenz auf genau, was die Antwort unten suggeriert. Zu dieser Zeit war subplot2grid/GridSpec/etc sehr neu und die meisten Leute verwendeten eine Matplotlib-Version, die sie nicht enthielt. Daher zeigte ich die weiter verbreitete Lösung und wies auf die neuere, sauberere Lösung hin. –

+0

@ Joe Kington, es tut mir leid – NameOfTheRose

14

Obwohl diese Frage alt ist, wollte ich eine sehr ähnliche Frage beantworten. @ Joes Referenz auf AxesGrid, war die Antwort auf meine Frage, und hat sehr einfache Verwendung, also wollte ich diese Funktionalität für die Vollständigkeit zu veranschaulichen.

AxesGrid Funktionalität bietet die Möglichkeit, Grundstücke unterschiedlicher Größe erstellen und sie setzen ganz gezielt über die subplot2grid Funktionalität:

import matplotlib.pyplot as plt 

ax1 = plt.subplot2grid((m, n), (row_1, col_1), colspan = width) 
ax2 = plt.subplot2grid((m, n), (row_2, col_2), rowspan = height) 

ax1.plot(...) 
ax2.plot(...) 

Beachten Sie, dass die max Werte für row_n, col_n sind m-1 und n-1 jeweils als Null Indizierung Notation wird verwendet.

Wenn wir speziell die Frage anstellten, ob es 5 Subplots insgesamt gab, wobei das letzte Subplot die doppelte Höhe wie die anderen hatte, könnten wir m=6 verwenden.

ax1 = plt.subplot2grid((6, 1), (0, 0)) 
ax2 = plt.subplot2grid((6, 1), (1, 0)) 
ax3 = plt.subplot2grid((6, 1), (2, 0)) 
ax4 = plt.subplot2grid((6, 1), (3, 0)) 
ax5 = plt.subplot2grid((6, 1), (4, 0), rowspan=2) 
plt.show() 

Last Graph, twice the height

+2

danke für die Veröffentlichung - Ich musste dies tun und es ist genau das, was ich suche. –

+1

Das ist wirklich einfach und funktioniert viel besser als die angenommene Antwort – jjz

Verwandte Themen