python / matplotlib kullanarak 3B grafikler için “kamera konumu” nasıl ayarlanır?


134

Ben mplot3d 3d veri güzel grafikler üretmek için kullanmayı öğrenmek ve şimdiye kadar oldukça mutluyum. Şu anda yapmaya çalıştığım şey, dönen bir yüzeyin küçük bir animasyonu. Bu amaçla, 3D projeksiyon için bir kamera konumu ayarlamam gerekiyor. Matplotlib etkileşimli olarak kullanılırken bir yüzey fare kullanılarak döndürülebildiğinden bu mümkün olmalıdır. Ama bunu bir senaryodan nasıl yapabilirim? Mpl_toolkits.mplot3d.proj3d'de çok fazla dönüşüm buldum ama bunları amacım için nasıl kullanacağımı bulamadım ve yapmaya çalıştığım şey için herhangi bir örnek bulamadım.


2
Jupyter not defterinde etkileşimli olarak nasıl döndürüleceğini merak edenler için yan not: kullanabilirsiniz%matplotlib notebook
YvesgereY

Ayrıca sağ fare düğmesini basılı tutarken sürüklemek kamera mesafesini değiştirir.
LoMaPh

Bu tür vizualizasyonlar için Mayavi'yi denerdim.
Tactopoda

Yanıtlar:


158

"Kamera konumu" ile 3D grafiği görüntülemek için kullandığınız yüksekliği ve azimut açısını ayarlamak istediğiniz gibi görünür. Bunu aşağıdakilerle ayarlayabilirsiniz:ax.view_init . Önce senaryoyu oluşturmak için aşağıdaki komut dosyasını kullandım, sonra iyi bir yükseklik belirledim ya da elevplanımı görüntülemek için. Daha sonra azimut açısını ayarladım ya da azimçizimimin etrafındaki 360 dereceyi değiştirmek için her örnekte rakamı sakladım (ve çizimi kaydederken hangi azimut açısına dikkat ederek). Daha karmaşık bir kamera tavası için, istenen efekti elde etmek için hem yüksekliği hem de açıyı ayarlayabilirsiniz.

    from mpl_toolkits.mplot3d import Axes3D
    ax = Axes3D(fig)
    ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
    for ii in xrange(0,360,1):
        ax.view_init(elev=10., azim=ii)
        savefig("movie%d.png" % ii)

26
Beni döv! Yan notta, bunlar ax.elevve ax.azimözellikleri olarak kullanılabilir . Aynı etkiyi elde etmek için yeni yazmış ax.azim = iihatta hatta olabilirsiniz ax.azim += 1.
Joe Kington

1
Üzgünüm seni yendim ama her yerde adil puan. Bu aynı zamanda benim bir kodlama alıntısı, bu for-loop içinde sadece view_init ve savefig'den daha fazlası vardı. =)
evren

4
Teşekkürler kozmos ve Joe, tam da aradığım şey buydu. Şimdi ne arayacağımı bildiğim için, ax.ist'i buldum - ax.azim ve ax.elev ile birlikte - kamera konumunu kutupsal koordinatlarda ayarlamayı sağlar.
Andreas Bleuler

Eğer cevap buysa - lütfen işaretleyebilir misiniz? Teşekkürler.
kozmos

12
Ayrıca kamera ve nesne noktası arasındaki mesafeyi ax.dist = 15 (varsayılan değer 10'dur) ile ayarlayabilirsiniz
Tim

14

Kullanışlı olan, Kamera konumunu yeni bir arsaya uygulamak olacaktır. Ben de çiziyorum, sonra fareyi mesafeyi değiştirerek çizimi hareket ettiriyorum. Ardından, başka bir çizimdeki mesafe de dahil olmak üzere görünümü çoğaltmayı deneyin. Ben axx.ax.get_axes () bana eski .azim ve .elev ile bir nesne alır buluyorum.

PYTHON'DA ...

axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist       # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist      # ALWAYS GIVES 10

Daha sonra 3d grafik ...

ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst                       # works but always 10 from axx

DÜZENLEME 1 ... TAMAM, Kamera konumu .dist değeri hakkında yanlış düşünme şeklidir. Tüm grafik için bir tür hackey skaler çarpanı olarak her şeyin üstünde yer alır.

Bu, görünümün büyütülmesi / yakınlaştırılması için çalışır:

xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev

Daha Sonra Grafik ...

ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1])     #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1])     #...
ax2.set_zlim3d(zlm[0],zlm[1])     #...

Hacky skaler çarpımını çağırmak için +1. Eğer perspektif umuyorsanız çok can sıkıcı bir durum.
user5920660
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.