Plotten mplot3d / axes3D xyz-plot mit logarithmischer Skalierung?
Ich habe gesucht hoch und niedrig für eine Lösung für dieses problem, aber ich kann nicht finden es überall! Es gibt Lasten der Beiträge detailliert semilog /loglog Auftragung von Daten in 2D z.B. plt.setxscale('log') aber ich bin interessiert in der Verwendung von logarithmischen Skalen auf einem 3d-plot(mplot3d).
Habe ich nicht den genauen code zu hand und kann so nicht hier posten, aber das einfache Beispiel unten sollte genug sein, um die situation zu erklären. Ich bin derzeit mit Matplotlib 0.99.1, sollte aber in Kürze ein Update auf 1.0.0 - ich weiß, ich werde zu aktualisieren meinem code für die mplot3d Umsetzung.
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()
Dem obigen code wird der plot in Ordnung in 3D, doch die drei Skalen (X, Y, Z) sind alle linear. Mein 'Y' Daten erstreckt sich über mehrere Größenordnungen (wie 9!), es wäre also sehr nützlich, um zu zeichnen Sie es auf eine log-Skala. Ich kann dies umgehen, indem der log der 'Y', wieder die numpy-array und die Auswertung der log(Y) auf eine lineare Skala, sondern in echten python-Stil ich bin auf der Suche nach INTELLIGENTEREN Lösung, die zeichnet die Daten auf einer log-Skala.
Ist es möglich, eine 3D-plot von meiner XYZ-Daten mit log-Skalen, im Idealfall würde ich mag X & Z auf linearen Skalen und Y auf eine logarithmische Skala?
Jegliche Hilfe würde sehr geschätzt werden. Bitte verzeiht mir offensichtliche Fehler in dem obigen Beispiel, wie bereits erwähnt, habe ich nicht meine genauen code zu haben und so verändert wurden, eine matplotlib Galerie Beispiel aus meiner Erinnerung.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da traf ich die gleiche Frage, und Alejandros Antwort nicht die gewünschten Ergebnisse produziert, hier ist was ich gefunden habe bisher.
Log-Skalierung für die Achsen in 3D ist ein Dauerthema in matplotlib. Momentan kann man nur die entsprechenden Achsen mit:
Wird dies jedoch nicht dazu, dass die Achsen logarithmisch skaliert, sondern logarithmisch beschriftet.
ax.set_yscale('log')
zu einer Ausnahme führen, in 3DFinden Sie auf github Ausgabe 209
Daher Sie haben noch zu neu das numpy-array
AttributeError: 'YAxis' object has no attribute 'set_scale'
Alles, was Sie tun müssen, definieren Sie die Skalierung der Achse, die Sie möchten. Zum Beispiel, wenn Sie möchten, dass die x-und y-Achse auf logarithmische Skalierung, sollten Sie schreiben:
und schließlich:
in osx: ran ax.zaxis._set_scale('log') (beachten Sie den Unterstrich)
Es gibt keine Lösung, weil das Problem, 209. Sie können jedoch versuchen, dies zu tun:
Wenn in "Y" - es ist 0, es erscheint eine Warnung, aber funktioniert immer noch. Wegen dieser Warnung farbigen Karten nicht funktionieren, so versuchen zu vermeiden, die 0 und negative zahlen. Zum Beispiel: