2D-Plots sitzen in python mplot3D nicht bündig an 3D-Achsenwänden

9

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

    
Timballisto 12.05.2015, 16:23
quelle

1 Antwort

4

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.

%Vor%

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.

    
decvalts 21.01.2017 12:09
quelle