2016-03-27 19 views
3

Bu bir Matplotlib 3D plot - 2D format for input data?'a oldukça benzer bir soru var ama bu sorunumu kısmen çözdüm (aslında .plot_surface() herhangi bir argümanı tanımıyordu). Ne yapmaya çalışıyorum Plot 2 parametrelerinin bir fonksiyonudur ve bu ne var: Bu hatayı atarpython - Matplotlib 3D giriş formatlama Z (bağımlı) değerler

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
X,Y = np.meshgrid(positions[0],np.transpose(positions[1])) 
Z = data[0] 
Axes3D.plot_surface(X, Y, Z) 

:

TypeError: plot_surface() missing 1 required positional argument: 'Z' 

veri [0] 2D dizidir. (veriler 2B dizilerinin bir listesidir). Pozisyonlar, bir satır vektörünün ve bir sütun vektörünün bir tuple'ıdır, bu yüzden çizgi 3, iki sıra vektörü olarak pozisyonları yeniden oluşturmak ve daha sonra Axes3D.plot_surface() 'in gerektirdiğine inandığımda Y için birer tane ve Y için bir tane olmak üzere iki matris oluşturmaktır.

Sorunum, Z, 2B dizisi olsa bile, .plot_surface() bunu tanımayı reddetmesidir.

Düzenleme:

if Z.shape == X.shape: 
    print('Same shape') 
    Axes3D.plot_surface(X, Y, Z) 

yüzden işe yaramaz neden hiçbir fikrim yok: Sadece Z'nin bu kullanarak doğru şekli gerçekten de doğruladı. X için Z'yi böyle kullanmamda bile (X'in eksik olduğu ya da yanlış şekil olduğundan şikayet etmediği için) hala kızar.

Axes3D.plot_surface(X, Y, X) 

Düzenleme: Örnekleri incelemek ve işleri denemek için sonunda işe koyuldum. Bu sorunu çözdüğümü pek düşünmüyorum, çünkü bir yolun neden işe yaramadığı konusunda bir fikrim hala yok ve bunu açmazdan bırakmak istemiyorum. Bunun yerine bu

surf = ax.plot_surface(X, Y, Z) 

"Axes3D.plotsurface()" yaparak çalışmak lazım. Bu değişikliğin neden işe yaradığına dair hiçbir fikrim yok, bu yüzden lütfen bunu çözmeme yardım edin.

+0

Bu doğru çizgiler boyunca tür şudur:

+0

Ama sorun şu ki zaten hav var e daha önce oluşturulan dizi. Bunu daha sonra tekrar yazabilirim, ama şu an ihtiyacım olan şey bu değil. Neden olduğu gibi çizilmediğini göremiyorum. –

+1

Ben de bunun içine koştum - belgeler bunu böyle kullanabileceğinizi önermek gibi görünüyor, ama hiç yapamazsınız. Axes3D.plot_surface (X = X, Y = Y, Z = Z) yaparsanız, 'self' eksik olduğunu görürsünüz. Bu, dokümanları biraz karıştıran bir sürüm 1.0.0 değişikliği gibi görünüyor. – OJFord

cevap

2

Dediğiniz gibi, bunu yapmak için doğru yol (aşağıdaki kodda ax) eksen nesnesi yoluyla olduğunu görünüyor: Alternatif

fig = plt.figure() 
ax = fig.gca(projection='3d') 
ax.plot_surface(X, Y, Z) 

, hala Axes3D kullanarak çağırabilirsiniz, ancak o zaman gerek böylece gibi, eksen nesnenin ax geçmek:

Axes3D.plot_surface(ax, X, Y, Z)