2010-10-11 5 views
9

Ich habe nach einer Lösung für dieses einfache Problem gesucht, aber ich kann es nirgends finden! Es gibt eine Menge von Posts, die das Semilog/Loglog-Plotten von Daten in 2D, z.B. plt.setxscale ('log') aber ich interessiere mich für Log-Skalen auf einem 3D-Plot (mplot3d).Plotten mplot3d/axes3D xyz Oberflächendiagramm mit logarithmischer Skala?

Ich habe nicht den genauen Code zur Hand und kann ihn daher hier nicht posten, aber das einfache Beispiel unten sollte ausreichen, um die Situation zu erklären. Ich verwende derzeit Matplotlib 0.99.1, sollte aber in Kürze auf 1.0.0 aktualisieren - ich muss meinen Code für die mplot3d-Implementierung aktualisieren.

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() 

Der obige Code wird in 3D-Plot feinen, jedoch sind die drei Skalen (X, Y, Z) sind alle linear. Meine 'Y'-Daten umfassen mehrere Größenordnungen (wie 9!), So dass es sehr nützlich wäre, sie auf einer logarithmischen Skala zu zeichnen. Ich kann das umgehen, indem ich das Logbuch des 'Y' nehme, das numpy Array wieder erstelle und das Log (Y) linear zeichne, aber im wahren Python-Stil suche ich nach einer intelligenteren Lösung, die die Daten auf einem plotet logarithmische Darstellung.

Ist es möglich, ein 3D-Oberflächendiagramm meiner XYZ-Daten mit Hilfe von Log-Skalen zu erstellen, idealerweise möchte ich X & Z auf linearen Skalen und Y auf einer logarithmischen Skala?

Jede Hilfe würde sehr geschätzt werden. Bitte verzeihen Sie alle offensichtlichen Fehler im obigen Beispiel, wie erwähnt, ich habe nicht meinen genauen Code zu haben und habe daher ein Matplotlib-Galerie-Beispiel aus meinem Gedächtnis geändert.

Dank

Antwort

4

Alles, was Sie tun müssen, ist die Skalierung der Achse, die Sie wollen, zu definieren. Zum Beispiel, wenn Sie, dass x und y-Achse wollen auf Log-Skala sind, sollten Sie schreiben:

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

und schließlich:

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

Die obige Antwort behauptet, dass diese Antwort falsch ist. Hast du eine Antwort darauf? – dbliss

10

Da ich die gleiche Frage und Alejandros Antwort begegnet nicht die produzierte gewünschte Ergebnisse hier ist was ich bisher herausgefunden habe.

Die Protokollskalierung für Achsen in 3D ist ein fortlaufendes Problem in Matplotlib. Aktuell können Sie nur die Achsen mit relabel:

ax.yaxis.set_scale('log') 

jedoch wird dies nicht die Achsen führen zu logarithmischen skaliert werden, sondern logarithmisch markiert. ax.set_yscale('log') wird eine Ausnahme in 3D

Siehe auf Github issue 209

daher nach wie vor führen, dass Sie die numpy Array

+0

Gibt es dafür schon Lösungen? Es scheint, dass set_yscale immer noch nicht in 3D funktioniert. – Blink

+0

Danke für den Hinweis auf den Fehlerbericht! – balu

+0

@Blink: Ich denke nicht. :( – balu

1

in osx neu erstellen müssen: lief ax.zaxis._set_scale ('log') (beachten Sie die Unterstrich)

Verwandte Themen