2012-11-22 10 views
5

meteogramErstellen Nebenhandlungen mit unterschiedlichen Formen in matplotlib

Ich suche eine Figur mit mehreren Nebenhandlungen viel wie diese in matplotlib Meteogramm zu erstellen. Ich brauche mehrere Unterplots unterschiedlicher Höhe (alle gleich breit, aber einige sind "dünner" und manche werden "fetter"). Genau wie das Bild oben, müssen einige Teilprozesse groß sein und einige müssen klein sein, aber sie müssen groß genug sein, um nützliche Informationen zu übermitteln, egal wie viele Teilprozesse es gibt.

Wenn ich ein Subplot als pyplotplot (2,1,1) erstelle, hat es das Seitenverhältnis, das ich brauche, aber wenn ich die Anzahl der Zeilen (zB Unterplot (3,1,1)) vergrößern, wird der Subplot "zu dünn". Ich werde ein halbes Dutzend dieser Plots an eine Figur anpassen müssen, aber sie werden zu "klein", wenn ich anfange, mehr Subplots auf die Figur zu passen.

Einfach gesagt, ist eine Figur wie dieses Meteogramm in Matplotlib möglich, ohne mehrere Bilder zusammenzunähen? Diese Bilder werden per URL-Anfrage von einem Server zurückgegeben, so dass es technisch möglich ist, aber wenn ich dieses Problem in der Bibliothek beheben kann, wäre das bevorzugt. Die Dokumentation von Matplotlib ist fantastisch, aber es scheint, dass Matplotlib so eingestellt ist, dass Sie Subplots mit demselben Seitenverhältnis erhalten, anstatt dass Sie Subplots mit beliebigen Seitenverhältnissen geben können, wenn die Anzahl der Subplots zunimmt. Ich kann kein einziges Beispiel im Netz mit unterschiedlichen Subplot-Größen finden.

+0

Ich weiß, dass dies eine sehr alte Frage ist. Aber konnte nicht widerstehen, dies zu fragen. Ist dein Meteogramm-Skript fertig? Ist es unter GPL lizenziert? –

+0

Leider nein. Wie so oft in meiner Erfahrung, wurde das Projekt verschrottet. Ich formatierte die Festplatte, die diesen Code hatte, so dass es für immer verloren ist. Es tut uns leid. – user1844160

Antwort

6

Sie können die Achsenpositionierung vollständig steuern, indem Sie ihr eine Begrenzungsbox in normalisierten Koordinaten geben (auf der Konstruktion). Das Format ist [links, oben, Breite, Höhe].

Ein Beispiel, wie ich über die Einrichtung der Figur gehen würde:

import matplotlib.pyplot as plt 


left = 0.1 
width = 0.8 

ax1 = plt.axes([left, 0.5, width, 0.45]) 
ax2 = plt.axes([left, 0.3, width, 0.19]) 
ax3 = plt.axes([left, 0.2, width, 0.09], sharex=ax2) 
ax4 = plt.axes([left, 0.1, width, 0.09], sharex=ax2) 

# ticks at the top of the top plot 
ax1.xaxis.tick_top() 

# remove ticks for ax2 and ax3 
ax2.xaxis.set_visible(False) 
ax3.xaxis.set_visible(False) 

# only put ticks on the bottom of ax4 
ax4.xaxis.tick_bottom() 

plt.show() 

ich einige Funktionen hinzugefügt haben, die Ihnen nützlich sein könnten (Entfernen der Top-Zecken, die x-Achse teilen, das Bewegen der Zecken die Spitze einer Äxte).

Das Ergebnis:

Example output

HTH

+0

Das ist nett. Mit etwas zusätzlichem Code ist es möglich, einige Größenparameter als Eingabe zu geben und die Layoutbegrenzungsbox als Ausgabe zurückzugeben! – heltonbiker

+0

Danke für die Antwort. Genau das habe ich gesucht. Während ich deinen Code getestet habe, habe ich auch nachgeschaut, wie man Bilder mit unterschiedlichen Seitenverhältnissen (x- und y-Größe) speichert und zwischen diesen beiden Techniken habe ich alles, was ich brauche. Danke noch einmal. – user1844160

2

können Sie Gridspec oder subplot2grid verwenden. Ich fand das spätere natürlich natürlicher zu verwenden, aber es ist persönliche Vorliebe. Auch Pelsons Antwort ist eine weitere Möglichkeit, dies zu tun.

Schauen Sie sich die beiden untersten Blöcke in this example an.

+0

Ich schätze die Antwort. Ich werde definitiv in diese schauen. – user1844160

Verwandte Themen