2013-05-01 11 views
5

problememmatplotlib - Błędne normalne na 3d bary działce


Przy użyciu matplotlib 3d barów i kreślenia na wykresie dostałem złe normalne wartości na niektórych twarzach kreskowych.


Przykład


Kiedy działki wysoki wykres koszach gęstości 240 barów, otrzymuję ten wynik: enter image description here

że niektóre twarze niektórych barach są błędne ? Bary Z porządku też się mylą.


O


używam najnowszą stabilną wersję matplotlib i NumPy. Moja wersja jest Python 2.7.3


DZIENNIKI


To jest tylko ostrzeżenie I dostać się z konsoli:

RuntimeWarning: nieprawidłowa wartość napotkanych w przepaści dla n in normals))


Każda pomoc jest doceniana.


EDIT

Z @Saullo Castro odpowiedź, to jest nowy wykres produkowane: enter image description here

Albo, używając próbki przedstawione w odpowiedzi (patrz obszar oznaczony czerwonymi kropkami)

enter image description here

Jedynym problemem, który pozostało, jest twarz paska na górze, ale jest już całkiem niezła. Jeśli ktoś ma jakieś uwagi na ten temat, pomóż mi.

Odpowiedz

4

Korzystanie parametr zsort='max' kiedy zadzwonić ax.bar3d() rozwiązuje problemu (patrz here):

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=1., zsort='max') 

użyłem zmodyfikowaną wersję kodu z this other question bawić się problemu:

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

data = np.array([[0,1,0,2,0], 
       [0,3,0,2,0], 
       [6,1,1,7,0], 
       [0,5,0,2,9], 
       [0,1,0,4,0], 
       [9,1,3,4,2], 
       [0,0,2,1,3], ]) 

column_names = ['a','b','c','d','e'] 
row_names = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'] 

fig = plt.figure() 
ax = Axes3D(fig) 

lx= len(data[0])   # Work out matrix dimensions 
ly= len(data[:,0]) 
xpos = np.arange(0,lx,1) # Set up a mesh of positions 
ypos = np.arange(0,ly,1) 
xpos, ypos = np.meshgrid(xpos+0.5, ypos+0.5) 

xpos = xpos.flatten() # Convert positions to 1D array 
ypos = ypos.flatten() 
zpos = np.ones(lx*ly)*1e-10 

dx = 1. * np.ones_like(zpos) 
dy = dx.copy() 
dz = data.flatten() 

ax.bar3d(xpos,ypos,zpos, dx, dy, dz, color='b', alpha=1., zsort='max') 
plt.ion() 
plt.show() 
+0

Dzięki , @SaulloCastro Ta modyfikacja jest prawie idealna. Kolejność Z jest teraz w porządku, z wyjątkiem górnej krawędzi paska. Opublikuję nowy wygenerowany obraz. –

+0

Dobrze to słyszeć! Post i możemy na to spojrzeć ... –

+0

Już tam jest. Jeśli masz jakieś uwagi, możesz edytować. Dzięki! –

Powiązane problemy