Ich versuche, 2D-Daten auf eine 3D-Achse zu zeichnen.
Ich habe die 3D-Form mit ax.plot_surface
arbeiten, aber ich bin nicht in der Lage, die 2D-Daten mit ax.plot
bündig an die Achsenwände zu setzen.
Hier ist ein abgespeckter Beispielcode, der das Problem zeigt, das ich mit den 2D-Daten habe:
%Vor%Dies ergibt das folgende Ergebnis, aus dem Sie möglicherweise erkennen können, dass die Enden der Datenlinien nicht auf den Achsenlinien liegen (dh nicht mit 0,04 und -0,04 ausgerichtet sind):
Durch interaktives Erforschen des Diagramms habe ich festgestellt, dass das Ändern der 0,08 in den ax.plot
-Aufrufen auf eine Magnitude von 0,083 (unter Beibehaltung der relevanten Zeichen) den Plots erlaubt, viel flacher zur Wand zu passen.
Meine Interpretation davon ist, dass die Handlung meine Achsengrenzen nicht durchsetzt, was offensichtlich in der Handlung erscheint, indem ich auf die Abstände schaue, wo sich die Achsen treffen, aber ax.get_xlim()
usw. benutzt, zeigt die Werte, die ich gesetzt habe. Ich vermisse etwas.
Irgendwelche Ideen, wie ich diese Plots dazu bringen kann, an den Wänden zu sitzen?
Vielen Dank,
Tim
Bearbeiten:
Ich habe auch versucht, die Achsengrenzen mit
festzulegen %Vor%und
%Vor%ohne Glück.
Ich bin definitiv geneigt, dies einem Problem zuzuordnen, bei dem sich die Achsen treffen, aber ich kann keine Dokumentation darüber finden. dh. Ich setze die Plot-Position auf -0,08 und das Achsenlimit auf -0,08, aber das Plot fügt am Ende ein kleines Padding hinzu, um die Grenzen irgendwo zwischen -0,082 und -0,083 zu setzen.
Ich möchte entweder das Padding entfernen oder den Padding-Wert abrufen, damit ich es in den Befehl ax.plot
eingeben kann.
Bearbeiten2:
Jemand anders, der auf dieses Problem gestoßen ist, aber das Problem nicht gelöst hat Ändern der Position der Gitterwände in einem mplot3d Figur
Sie haben Recht, das Modul mplot3d
enthält eine Funktion, die vor dem Rendern der Achse die Mindest- und Höchstwerte für die Achse auffüllt.
Leider ist die Menge an Padding fest in der letzten verfügbaren Version von matplotlib (v2.0) gespeichert und kann derzeit nicht vom Benutzer geändert werden.
Lösung 1: Ändern Sie den Quellcode
Ich habe festgestellt, dass es möglich ist, die zusätzliche Auffüllung zu deaktivieren, indem Sie zwei Quellcodezeilen in der Quelltextdatei axis3d.py auskommentieren. (Im Quellverzeichnis matplotlib ist dies unter mpl_toolkits & gt; mplot3d & gt; axis3d.py)
zu finden In der Funktion _get_coord_info()
verwendet die Funktion zuerst die Getterfunktion get_w_lims()
, um die von Ihnen festgelegten x-, y- und z-Limits abzurufen. Sie werden nicht direkt geändert, weshalb, wenn Sie beispielsweise ax.get_xlim()
überprüfen, die Werte 0.08 und -0.08 zurückgegeben werden.
Beachten Sie, dass das Padding auf eine etwas willkürliche Weise berechnet wird. Das Padding ist also keine feste Zahl, aber ist abhängig von den eingestellten Achsenlimits.
%Vor% Wenn die Funktion draw()
zum Rendern der Achse aufgerufen wird, verwendet sie diese modifizierten mins
und maxs
, um die tatsächliche Linie zu konstruieren, die Sie sehen. Daher erhalten Sie immer die Auffüllung an jedem Ende der Achse.
Meine Hacky-Lösung besteht darin, die beiden Zeilen einfach so zu kommentieren:
%Vor%Geben Sie die Figur mit den Linien bündig gegen die Wände der 3D-Achse.
Beachten Sie jedoch, dass die Achsenbeschriftungen in der unteren Ecke einander überlappen und die y-Beschriftungen falsch ausgerichtet sind ... Ich vermute, dass dies der Grund dafür ist, dass das hartcodierte Padding ein Feature ist. Es ist möglich, die Y-Achsen-Tick-Beschriftungen mit der Drehung zu optimieren Eigenschaft
in der set_yticklabels(...)
-Methode, bis es für Ihre Bedürfnisse richtig aussieht.
Lösung 2: Verwenden Sie den Zoom im interaktiven Plotfenster
Eine andere (Sortier-) Lösung, bei der der Quellcode nicht geändert werden muss, besteht darin, die Figur in einem interaktiven Fenster zu zeichnen und dann leicht zu vergrößern, bis die Linien bündig mit der Wand erscheinen. Es erfordert ein wenig Versuch und Irrtum, da es eine "by-eye" -Methode ist. Beachten Sie, dass damit in der Regel die höchsten Teilstrichmarken entfernt werden, das überlappende Problem in der obigen Lösung jedoch vermieden wird.:
Lösung 3: Kombinieren Sie alle oben genannten
Wenn wir also wissen, wie mplot3d
die Padding-Beträge berechnet, können wir damit die Achsengrenzen auf genau den richtigen Betrag setzen, um Padding-Probleme zu vermeiden und den interaktiven Modus zu verwenden oder den Quellcode zu ändern?
Ja, mit einer kleinen Zusatzfunktion:
%Vor%Dies ergibt die gleiche Abbildung aus Lösung 2, ohne das interaktive Plot-Fenster zu öffnen und nach Augenmaß zu beurteilen.
Tags und Links python matplotlib python-2.7 mplot3d