2011-01-20 9 views
19

Mam problem z wykreślaniem wielu wątków. Chciałbym ustawić współczynnik kształtu FIZYCZNEGO z podpól na stałą wartość. W moim przykładzie mam 12 wątków (4 wiersze i 3 kolumny) na rysunku A4. Tam wszystkie subplots są ładnie umieszczone na całej figurze, a dla wszystkich wątków wysokość jest prawie równa szerokości.matplotlib - subplots ze stałym współczynnikiem proporcji

Ale jeśli zmienię układ mojej figury na portret, subplots są rozciągnięte w pionie. I to jest dokładnie to, co nie powinno się zdarzyć. Chciałbym mieć taką samą wysokość i szerokość wątków, jak na rysunku krajobrazu. Czy istnieje możliwość, że proporcje poszczególnych wątków pozostaną takie same?

Dzięki z góry, Peter

EDIT: Znalazłem obejście. Ale to po prostu działa na non-logarytmicznych osi ...

aspectratio=1.0 
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0]) 
ax.set_aspect(ratio_default*aspectratio) 

Odpowiedz

15

Właściwie, czego chcą jest dość proste ... Po prostu trzeba się upewnić, że adjustable jest ustawiony na 'box' na swoich osiach, a ty mieć ustawiony współczynnik proporcji dla osi (wszystko inne niż 'auto').

Możesz to zrobić za pomocą kwarg adjustable podczas tworzenia subplots. Alternatywnie możesz to zrobić po utworzeniu, dzwoniąc pod numer ax.set_adjustable('box') lub dzwoniąc pod numer ax.set_aspect(aspect, adjustable='box') (gdzie aspekt to 'equal' lub numer).

Teraz, niezależnie od zmiany rozmiaru figury, partycje zachowują ten sam współczynnik kształtu.

Na przykład:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3) 
ax2 = fig.add_subplot(2,1,2) 

ax1.plot(range(10)) 
ax2.plot(range(10)) 

plt.show() 

Teraz porównać jak górna subplot reaguje na zmianę rozmiaru, w porównaniu jak dno subplot odpowiada:


Początkowe działka alt text

Zmieniono na układ pionowy: alt text

zmieniany na układzie poziomym: alt text

+0

Stoję poprawione. Dobrze wiedzieć. –

+0

Witam! Dzięki za odpowiedź. Niestety, ustawia tylko współczynnik proporcji osi wątków. Ponieważ mam wiele różnych zakresów moich osi, musiałbym ustawić ten współczynnik proporcji dla każdego subplot indywidualnie.Chciałem więc ustawić wysokość i szerokość moich wątków (a nie tylko osi) na określony współczynnik proporcji. –

3

Twój obejście działa dla mnie. Po wykreślania danych wzywam następujące funkcję:

def fixed_aspect_ratio(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = xvals[1]-xvals[0] 
    yrange = yvals[1]-yvals[0] 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 
+0

To zadziałało dobrze dla mnie. Zmodyfikowałem funkcję, aby zaakceptować argument "siekiery", aby móc go zastosować do podpikseli. Zmieniłem również "gca(). Axes" na 'ax' i' gca() 'na' ax'. – Steve

1

W odpowiedzi na uwagi o rozwiązanie nie działa dla logarytmicznych działek w edycji do pierwotnego pytania - trzeba dostosować się następująco:

def fixed_aspect_ratio_loglog(ratio): 
    ''' 
    Set a fixed aspect ratio on matplotlib loglog plots 
    regardless of axis units 
    ''' 
    xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim() 

    xrange = log(xvals[1])-log(xvals[0]) 
    yrange = log(yvals[1])-log(yvals[0]) 
    gca().set_aspect(ratio*(xrange/yrange), adjustable='box') 

(Dostosowanie do wykresów w półkolach powinno być teraz oczywiste)

Powiązane problemy