2011-01-20 22 views
19

Birden çok alt çizimin çizilmesiyle ilgili bir sorunum var. Alt piksellerin FİZİKSEL boy oranını sabit bir değere ayarlamak istiyorum. Örneğimde bir yatay A4 resminde 12 alt nokta (4 satır ve 3 sütun) var. Tüm alt bölümler tüm şekilde güzel bir şekilde yerleştirilmiştir ve tüm alt alanlar için yükseklik neredeyse genişliğe eşittir.matplotlib - sabit en boy oranına sahip alt pikseller

Ancak, şekilimin düzenini dikey olarak değiştirirseniz alt pikseller dikey olarak uzatılır. Ve bu tam olarak ne olmamalı. Peyzaj figüründe olduğu gibi alt noktaların aynı yüksekliğe ve genişliğine sahip olmak isterim. Alt piksellerin en boy oranının aynı kalması ihtimali var mı? peşin

sayesinde Peter

DÜZENLEME: Ben geçici bir çözüm bulduk. Ama bu sadece ne isteyen konum oldukça basittir, ... olmayan logaritmik eksen için Aslında

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) 

cevap

15

çalışır ... Sadece adjustable senin eksenler üzerinde 'box' için ayarlanmış olduğundan emin olmak için gerekir ve Eksenler için bir en boy oranına sahip olmak ('auto''dan başka bir şey).

Alt pikselleri oluştururken bunu adjustable kwarg ile yapabilirsiniz. Alternatif olarak, bunu oluşturduktan sonra ax.set_adjustable('box') numaralı telefonu arayarak veya ax.set_aspect(aspect, adjustable='box') numaralı telefonu arayarak yapabilirsiniz (buradaki boyut 'equal' veya bir sayıdır).

Şimdi, şeklin nasıl yeniden boyutlandırıldığına bakılmaksızın, alt pikseller aynı en boy oranını koruyacaktır. Örneğin

: Üst subplot yeniden boyutlandırma nasıl yanıt

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() 
Şimdi

, karşılaştırma, vs alt subplot nasıl tepki:


başlangıç ​​arsa alt text

Dikey düzende yeniden boyutlandırılıyor:

yatay düzen olarak yeniden boyutlandırıldı: alt text

+0

Düzeltilmeye hazır durumdayım. Bilmek güzel. –

+0

Merhaba! Cevabın için teşekkürler. Ne yazık ki, bu alt bölümlerin eksenlerinin sadece en boy oranını ayarlar. Eksenlerimden çok farklı aralıklara sahip olduğum için, her altpip için ayrı ayrı bu en boy oranını ayarlamanız gerekir.Bu yüzden yapmak istediğim, alt piksellerimin (sadece eksenleri değil) genişliğini ve genişliğini belirli bir en boy oranına ayarlamak. –

3

Kişisel geçici çözüm benim için çalışıyor. Verileri komplo sonra şu işlevi çağırmak: -

çözüm asıl soruya düzenlemek logaritmik araziler için çalışmıyor hakkında tespite cevap olarak
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

Bu benim için iyi çalıştı. Fonksiyonu bir "ax' argümanı" kabul etmek için değiştirdim, böylece subplots'a uygulayabilirim. Ben de gca() eksenlerini "ax" ve "gca" ile "ax" ile değiştirdim. – Steve

1

aşağıdaki gibi uyarlamak gerekir:

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') 

(Simgesel grafikler için düzenleme şimdi belirgin olmalıdır)

İlgili konular