2011-01-19 12 views
16

Şu anda bir 3d dağılım taslağını çizmek için matplotlib kullanıyorum ve işi bitirirken, verileri daha iyi görmek için onu döndürmenin bir yolunu bulamıyorum.Python'da etrafta dönebildiğim bir 3d dağılımı çizmenin kolay bir yolu var mı?

İşte bir örnek:

import pylab as p 
import mpl_toolkits.mplot3d.axes3d as p3 

#data is an ndarray with the necessary data and colors is an ndarray with 
#'b', 'g' and 'r' to paint each point according to its class 

... 

fig=p.figure() 
ax = p3.Axes3D(fig) 
ax.scatter(data[:,0], data[:,2], data[:,3], c=colors) 
ax.set_xlabel('X') 
ax.set_ylabel('Y') 
ax.set_zlabel('Z') 
fig.add_axes(ax) 
p.show() 

bana yürütme süre içinde bunu ancak bu süre bunu döndürebilir olarak sağlayan bir çözüm istiyorum ve/kısa onunla iyiyim hızlı. İşte

iris veri kümesine bir PCA uygulandıktan sonra üretilen araziler bir karşılaştırması verilmiştir:,
1. Mayavi
alt text
2. matplotlib Mayavi daha kolay verileri görselleştirmek için yapar
alt text

ama MatPlotLib daha profesyonel görünüyor. Matplotlib de daha hafiftir. mayavi kullanma

cevap

11

, sen

import enthought.mayavi.mlab as mylab 
import numpy as np 
x, y, z, value = np.random.random((4, 40)) 
mylab.points3d(x, y, z, value) 
mylab.show() 

GUI tıklayarak ve sürükleyerek ve sağ tıklayarak-ve sürümesiyle yoluyla/uzaklaşması yoluyla dönüşe imkan veren böyle bir arsa oluşturabilir.

alt text

+0

Bu bir görüntü daha iyi çünkü zum siz zum yaparken boyutunuzu artırır (matplotlib yakınlaştırmayı o kadar kolaylaştırmaz) ve aynı zamanda matplotlib, yakınlaştırma işlemine devam etmeyen eksen kutusunu çizer. Bu bir çok daha ağır/yavaş olsa da, muhtemelen sadece yakınlaştırmak zorunda olduğunuzda kullanmak daha iyidir. – pnodbnda

+0

Bu satır ('import enthought.mayavi.mlab mylab' olarak) benim için çalışmadı. Görünüşe göre bir modül değildi. – Richard

+0

@Richard: "Mayavi" kurulu mu? Kurulum mayavi modülünün nasıl alınacağı ile ilgili talimatlarla birlikte gelmelidir. – unutbu

24

Eh, öncelikle ... "verilerim iyi görmek" ile ne demek istediğinizi tanımlamanız gerekir

Sen döndürmek ve eğer, fareyi kullanarak arsa üzerinde yakınlaştırabilir

etkileşimli çalışmak istiyorum. Sadece programlama eksenleri döndürmek isteyen konum

ardından ax.view_init(elev, azim) nerede elev ve azim sen adresinin arsa görüntülemek istediğiniz (derece) yükseklik ve azimut açıları vardır kullanın.

Alternatif olarak,/get geçerli görünüm noktasının yükseklik, azimut ve mesafe ayarlamak için ax.elev, ax.azim ve ax.dist özelliklerini kullanabilirsiniz.

Borçlanma sourcethis example den: gösterildiği gibi alt text

Sen programlama eksenleri döndürebilirsiniz: Biz güzel scatterplot olsun

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

def randrange(n, vmin, vmax): 
    return (vmax-vmin)*np.random.rand(n) + vmin 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
n = 100 
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: 
    xs = randrange(n, 23, 32) 
    ys = randrange(n, 0, 100) 
    zs = randrange(n, zl, zh) 
    ax.scatter(xs, ys, zs, c=c, marker=m) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

plt.show() 

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

def randrange(n, vmin, vmax): 
    return (vmax-vmin)*np.random.rand(n) + vmin 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
n = 100 
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: 
    xs = randrange(n, 23, 32) 
    ys = randrange(n, 0, 100) 
    zs = randrange(n, zl, zh) 
    ax.scatter(xs, ys, zs, c=c, marker=m) 

ax.set_xlabel('X Label') 
ax.set_ylabel('Y Label') 
ax.set_zlabel('Z Label') 

ax.azim = 200 
ax.elev = -45 

plt.show() 

alt text

Bu biraz yardımcı olur umarım!

+0

'u komik kullanmanızı öneriyoruz, daha önce döndürmek için alamadım ama şimdi çalışıyor. figür git. Herhangi bir fark yaratırsa, python 2.6 ile ubuntu 10.10 kullanıyorum. – pnodbnda

+0

mplot3d mayava'dan çok rahat ve hafiftir. Ancak karmaşık 3 boyutlu sahnelere ihtiyacınız varsa, mplot3d MayaVi'yi kullanmanızı önerir. Örneğin. Yukarıdaki yanıtı unutbu'ya bakınız. – nealmcb

+0

mplot3d sadece KORKUNÇ! 3 boyutlu grafiklerde kritik bir şey olan arsanın dönme merkezini hareket ettirecek bir işlevi bile yoktur. – Mehdi