2010-07-08 16 views
17

Wenn ich diesen Code ausführenErstellen Quadrat Nebenhandlungen (von gleicher Höhe und Breite) in matplotlib

from pylab import * 

figure() 
ax1 = subplot(121) 
plot([1, 2, 3], [1, 2, 3]) 
subplot(122, sharex=ax1, sharey=ax1) 
plot([1, 2, 3], [1, 2, 3]) 
draw() 
show() 

ich zwei Handlungsstränge, die in der X-Dimension „gestaucht“ werden. Wie bekomme ich diese Teilplots so, dass die Höhe der Y-Achse gleich der Breite der X-Achse für beide Teilplots ist?

Ich benutze Matplotlib v.0.99.1.2 auf Ubuntu 10.04.

Update 2010-07-08: Schauen wir uns einige Dinge an, die nicht funktionieren.

Nachdem ich den ganzen Tag gegoogelt habe, dachte ich, dass es mit der automatischen Skalierung zusammenhängen könnte. Also habe ich versucht, damit zu spielen.

from pylab import * 

figure() 
ax1 = subplot(121, autoscale_on=False) 
plot([1, 2, 3], [1, 2, 3]) 
subplot(122, sharex=ax1, sharey=ax1) 
plot([1, 2, 3], [1, 2, 3]) 
draw() 
show() 

matplotlib besteht auf automatischer Skalierung.

from pylab import * 

figure() 
ax1 = subplot(121, autoscale_on=False) 
plot([1, 2, 3], [1, 2, 3]) 
subplot(122, sharex=ax1, sharey=ax1, autoscale_on=False) 
plot([1, 2, 3], [1, 2, 3]) 
draw() 
show() 

In diesem verschwindet die Daten vollständig. WTF, Matplotlib? Nur WTF?

Okay, gut vielleicht, wenn wir das Seitenverhältnis reparieren?

from pylab import * 

figure() 
ax1 = subplot(121, autoscale_on=False) 
plot([1, 2, 3], [1, 2, 3]) 
axes().set_aspect('equal') 
subplot(122, sharex=ax1, sharey=ax1) 
plot([1, 2, 3], [1, 2, 3]) 
draw() 
show() 

Dieser bewirkt, dass das erste Teilplot vollständig verschwindet. Das ist urkomisch! Wer hat das erfunden?

In aller Ernsthaftigkeit, jetzt ... sollte das wirklich so schwer zu erreichen sein?

Antwort

16

Ihr Problem den Aspekt der Plots bei der Einrichtung in kommt, wenn Sie sharex und Sharey verwenden.

Eine Problemumgehung besteht darin, nur gemeinsam genutzte Achsen nicht zu verwenden. Zum Beispiel könnten Sie dies tun:

from pylab import * 

figure() 
subplot(121, aspect='equal') 
plot([1, 2, 3], [1, 2, 3]) 
subplot(122, aspect='equal') 
plot([1, 2, 3], [1, 2, 3]) 
show() 

jedoch eine bessere Abhilfe ist, die „adjustable“ keywarg ... Sie wollen einstellbar = ‚Box‘ zu ändern, aber wenn Sie gemeinsame Achsen verwenden, es hat einstellbar sein = 'datalim' (und zurück auf 'box' setzen gibt einen Fehler).

Es gibt jedoch eine dritte Option für adjustable, um genau diesen Fall zu behandeln: adjustable="box-forced".

Zum Beispiel:

from pylab import * 

figure() 
ax1 = subplot(121, aspect='equal', adjustable='box-forced') 
plot([1, 2, 3], [1, 2, 3]) 
subplot(122, aspect='equal', adjustable='box-forced', sharex=ax1, sharey=ax1) 
plot([1, 2, 3], [1, 2, 3]) 
show() 

oder in moderneren Stil (Anmerkung: dieser Teil der Antwort habe im Jahr 2010 nicht funktioniert):

import matplotlib.pyplot as plt 

fig, axes = plt.subplots(ncols=2, sharex=True, sharey=True) 
for ax in axes: 
    ax.plot([1, 2, 3], [1, 2, 3]) 
    ax.set(adjustable='box-forced', aspect='equal') 

plt.show() 

So oder so, Sie erhalten etwas ähnliches wie:

enter image description here

+0

ich benutze Achse ('gleich') für mehr MATLAB wie Synthax. Und wenn Aspekt in MATLAB 1 "Achsenquadrat" sein muss, verwende ich Abbildung (1, figsize = (6, 6)). – otterb

+0

Leider sind die Aktienachsen weg und man muss die Tickelabels von Hand entfernen. Das ist bedauerlich :(. Was tut, Arbeit verwendet 'subplot_kw = {'einstellbar': 'Box-forciert', 'Aspekt': 'gleich'}' als eine Option zu "subplots". Nur Problem jetzt ist das die Achsenbeschriftungen werden immer noch für die "gemeinsamen" Achsen angezeigt ... – rubenvb

+0

OK ... wo hast du die API-Beschreibung 'adjustable = 'box-forced' gefunden? Ich werde hier ein bisschen verrückt ... – Atcold

2

Geben Sie diesen einen Versuch:

from pylab import * 

figure() 
ax1 = subplot(121, autoscale_on=False, aspect='equal', xlim=[1,3], ylim=[1,3]) 
plot([1, 2, 3], [1, 2, 3]) 
##axes().set_aspect('equal') 
ax2 = subplot(122, autoscale_on=False, aspect='equal', xlim=[1,3], ylim=[1,3]) 
plot([1, 2, 3], [1, 2, 3]) 
draw() 
show() 

ich aus der axes() Linie kommentierte, dass ein neues axes an einer beliebigen Stelle schaffen würde, anstatt ein vorgefertigtes subplot mit einer berechneten Position.

Mit dem Aufruf subplot wird tatsächlich eine Axes Instanz erstellt, was bedeutet, dass sie die gleichen Eigenschaften wie Axes verwenden kann.

Ich hoffe, das hilft :)

Verwandte Themen