Soru python / matplotlib kullanarak 3d grafikler için “kamera pozisyonu” nasıl ayarlanır?


3d veri güzel araziler üretmek için mplot3d kullanmayı öğreniyorum ve şimdiye kadar oldukça mutluyum. Şu an yapmaya çalıştığım şey, dönen bir yüzeyin küçük bir animasyonudur. Bu amaçla, 3D projeksiyon için bir kamera pozisyonu ayarlamam gerekiyor. Matplotlib'i etkileşimli olarak kullanırken, bir yüzeyin 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 dosyasında çok fazla dönüşüm buldum ama bunları amacım için nasıl kullanamadığımı anlayamadım ve yapmaya çalıştığım şey için bir örnek bulamadım.


95
2017-10-15 22:25


Menşei


Jupyter not defterinde etkileşimli olarak nasıl döneceğinizi merak edenler için yan not: kullanabilirsiniz %matplotlib notebook - YvesgereY


Cevaplar:


"Kamera konumu" ile, 3D arsayı görüntülemek için kullandığınız yükseklik ve azimut açısını ayarlamak istediğiniz gibi geliyor. İlk senaryoyu oluşturmak için aşağıdaki senaryoyu kullandım, sonra iyi bir yükseklik belirledim ya da elev, arsalarımı görmek için. Azimut açısını ayarladıktan sonra veya azim, her bir örnekte (ve çizimi kaydettiğimde hangi azimut açısını belirlediğimi) kaydetmek için, benim arsa etrafımdaki 360deg'yi değiştirmek. Daha karmaşık bir kamera tavası için, istediğiniz 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)

110
2017-10-15 23:31



Beni ona yen! Bir yan not, bunlar olarak kullanılabilir ax.elev ve ax.azim özellikleri. Ayrıca yeni yazmış olabilirsiniz ax.azim = ii ya da ax.azim += 1 aynı etkiyi elde etmek için. - Joe Kington
Üzgünüm seni yendim ama etrafta adil noktalar var. Bu aynı zamanda sadece benim için bir kodlama alıntıdır, sadece o view_init ve savefig'den daha fazla for döngüsü vardır. =) - cosmosis
Teşekkürler kozmos ve Joe, tam olarak aradığım şey buydu. Artık ne arayacağımı bildiğimden, ax.azim ve ax.elev ile birlikte kamera konumunu kutupsal koordinatlarda ayarlamaya izin veren ax.dist'i de buldum. - Andreas Bleuler
Eğer cevap bu ise - lütfen kontrol edermisiniz? Teşekkürler. - cosmosis
Kamera ve nesne noktası arasındaki mesafeyi ax.dist = 15 (varsayılan değer 10 olacak şekilde) olarak da ayarlayabilirsiniz. - Tim


Kullanışlı olan şey, Kamera pozisyonunu yeni bir arsaya uygulamak olurdu. Ben çiziyorum, sonra arsa fareyi mesafeyi değiştirerek hareket ettirin. Ardından başka bir arsadaki mesafeyi de içeren görünümü çoğaltmaya çalışın. 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

1 EDIT ... Tamam, kamera konumu .dist değeriyle ilgili yanlış düşünme şeklidir. Tüm grafik için bir tür hacker skaler çarpanı olarak her şeyin üstüne geliyor.

Bu, görüntünün büyütülmesi / yakınlaştırması 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

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])     #...

10
2017-09-15 23:25



Hacky skaler çarpımını çağırmak için +1. Bakış açısını umuyor olsaydın çok sinir bozucu. - user5920660