2011-02-06 17 views
11

Próbuję utworzyć trójwymiarowy wykres powierzchni dla wyrażenia: z = y^2/x, dla x w przedziale [-2,2] iy w przedziale [-1.1,4.4]. Chcę również, aby wartości z z zakresu od -4 do 4.Python/matplotlib mplot3d- jak ustawić maksymalną wartość dla osi Z?

Problem polega na tym, że gdy oglądam gotowy surfaceplot, wartości osi Z nie zatrzymują się na [-4,4].

Moje pytanie brzmi: jak mogę "usunąć" wartość osi z, która znajduje się poza intervall [-4,4] z gotowego wykresu?

Mój kod to:

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

fig = plt.figure() 
ax = fig.gca(projection="3d") 

x = np.arange(-2.0,2.0,0.1,float)  # x in interval [-2,2] 
y = np.arange(-1.4,1.4,0.1,float)  # y in interval [-1.4,1.4] 
x,y = np.meshgrid(x,y) 
z = (y**2/x)       # z = y^2/x 

ax.plot_surface(x, y, z,rstride=1, cstride=1, linewidth=0.25) 

ax.set_zlim3d(-4, 4)     # viewrange for z-axis should be [-4,4] 
ax.set_ylim3d(-2, 2)     # viewrange for y-axis should be [-2,2] 
ax.set_xlim3d(-2, 2)     # viewrange for x-axis should be [-2,2] 
plt.show() 

Odpowiedz

1

wycinek danych będzie tego dokonać, ale to nie jest bardzo ładna.

z[z>4]= np.nan 
z[z<-4]= np.nan 
+0

Czy nie ma lepszego sposobu, to zrobić? Aby jakoś "odciąć" wartości z poza zakresem [-4,4] podczas przeglądania wykresu? – user605243

+0

@ user605243: w zasadzie powinieneś być w stanie użyć masked_array, jak możesz z wykresami 2D. W praktyce wygląda na to, że nie działa (chociaż niezbędne zmiany w axes3d.py powodują, że nie wydaje się to zbyt trudne). Niestety, nie mogłem tak naprawdę uzyskać sztuczki np.nan, z mnóstwem " CGPathCloseSubpath: brak bieżącego punktu. " błędy. – DSM

9

Mam ten sam problem i nadal nie znalazłem nic lepszego niż przycinanie moich danych. Niestety w moim przypadku jestem związany z matplotlib 1.2.1. Ale w przypadku, gdy można uaktualnić do wersji 1.3.0, można mieć rozwiązanie: wydaje się, że jest kilka nowych API związanych z zakresami osi. W szczególności możesz być zainteresowany "set_zlim".

Edytuj 1: Zarządzaj migracją mojego środowiska, aby korzystać z programu matplotlib 1.3.0; set_zlim pracował jak urok :)

Kod follwing pracował dla mnie (Nawiasem mówiąc używam tego na OSX, nie jestem pewien, że to ma wpływ?):

# ---------------------------------------------------------------------------- 
# Make a 3d plot according to data passed as arguments 
def Plot3DMap(self, LabelX, XRange, LabelY, YRange, LabelZ, data3d) : 
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection="3d") 
    xs, ys = np.meshgrid(XRange, YRange) 
    surf = ax.plot_surface(xs, ys, data3d) 
    ax.set_xlabel(LabelX) 
    ax.set_ylabel(LabelY) 
    ax.set_zlabel(LabelZ) 
    ax.set_zlim(0, 100) 
    plt.show() 
+1

Czy możesz potwierdzić, że set_zlim działa dla Ciebie? Używam wersji 1.3.1 i kiedy 'set_zlim' lub' set_zlim3d' ogranicza to tylko osie, ale faktycznie nie przycina danych. – KobeJohn

+1

Czy możesz wyjaśnić, jak używać set_zlim? – Jonny

+0

@ Jon: http://matplotlib.org/mpl_toolkits/mplot3d/api.html#mpl_toolkits.mplot3d.axes3d.Axes3D.set_zlim – TocToc

Powiązane problemy