2010-10-11 14 views
9

Szukałem rozwiązania wysokiego i niskiego dla rozwiązania tego prostego problemu, ale nie mogę go nigdzie znaleźć! Istnieje wiele postów opisujących tworzenie wykresów półilogowych/loglogowych danych w 2D, np. plt.setxscale ('log') jednak jestem zainteresowany wykorzystaniem skal logu na wykresie 3d (mplot3d).Wykreślanie wykresu powierzchni mplot3d/axes3D xyz za pomocą skali logarytmicznej?

Nie mam dokładnego kodu do przekazania, więc nie można go opublikować tutaj, jednak prosty przykład poniżej powinien wystarczyć do wyjaśnienia sytuacji. Obecnie używam Matplotlib 0.99.1, ale wkrótce powinienem zaktualizować do 1.0.0 - Wiem, że będę musiał zaktualizować mój kod do implementacji mplot3d.

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = Axes3D(fig) 
X = np.arange(-5, 5, 0.025) 
Y = np.arange(-5, 5, 0.025) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, extend3d=True) 
ax.set_zlim3d(-1.01, 1.01) 

ax.w_zaxis.set_major_locator(LinearLocator(10)) 
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) 

fig.colorbar(surf) 

plt.show() 

Powyższy kod będzie działał dobrze w 3D, jednak wszystkie skale (X, Y, Z) są liniowe. Moje dane "Y" rozciągają się o kilka rzędów wielkości (jak 9!), Więc bardzo przydatne byłoby wykreślenie ich na skali logarytmicznej. Mogę obejść to, biorąc dziennik "Y", odtwarzając tablicę numpy i wykreślając dziennik (Y) w skali liniowej, ale w prawdziwym stylu Pythona szukam mądrzejszego rozwiązania, które wyrysuje dane na skala logarytmiczna.

Czy możliwe jest wykonanie trójwymiarowego wykresu powierzchni moich danych XYZ za pomocą skali logarytmicznej, najlepiej jeśli chciałbym uzyskać X & Z w liniowej skali i Y w skali logarytmicznej?

Każda pomoc zostanie bardzo doceniona. Proszę wybaczyć wszelkie oczywiste błędy w powyższym przykładzie, jak wspomniano, że nie mam mojego dokładnego kodu, a więc zmieniłem przykład galerii matplotlib z mojej pamięci.

Dzięki

Odpowiedz

4

Wszystko co musisz zrobić, to określić skalę osi chcesz. Na przykład, jeśli chcesz, aby oś X i Y są na skali logarytmicznej, należy napisać:

ax.xaxis.set_scale('log') 
ax.yaxis.set_scale('log') 

i ostatecznie:

ax.zaxis.set_scale('log') 
+1

powyższa odpowiedź twierdzi, że ta odpowiedź jest błędna. czy masz na to odpowiedź? – dbliss

10

Odkąd spotkałem to samo pytanie i Alejandros odpowiedź nie produkowane Pożądane wyniki tutaj jest to, co dowiedziałem się do tej pory.

Skalowanie logów dla osi w 3D jest bieżącym problemem w matplotlib. Obecnie można relabel tylko osie z:

ax.yaxis.set_scale('log') 

Nie będzie to jednak powodować osie być skalowane logarytmiczna ale oznakowane logarytmiczna. ax.set_yscale('log') spowoduje wyjątek w 3D

Zobacz na github issue 209

Dlatego trzeba jeszcze odtworzyć NumPy tablicę

+0

Czy są jeszcze znane rozwiązania? Wygląda na to, że set_yscale nadal nie działa w 3D. – Blink

+0

Dziękujemy za zgłoszenie błędu! – balu

+0

@Blink: Nie sądzę. :( – balu

1

w OSX: prowadził ax.zaxis._set_scale ('log') (zawiadomienie podkreślenie)

Powiązane problemy