matplotlib Probleme beim Plotten protokollierter Daten und Setzen der X / Y-Grenzen

8

Ich verwende Log-Plots wie folgt in Matplotlib, ungefähr wie folgt.

%Vor%

Das erste Problem ist, dass matplotlib ohne x, y limits Maßstäbe so einstellt, dass die meisten Daten nicht sichtbar sind - aus irgendeinem Grund werden die minimalen und maximalen Werte entlang der x- und y-Dimensionen nicht verwendet Standard-Plot ist extrem irreführend.

Wenn ich die Grenzen manuell unter Verwendung von plt.xlim, plt.ylim festlege, was ich in log10 Einheiten (d. h. 1/10 bis 3000) als -1 bis 3 interpretiere, erhalte ich ein Diagramm wie das angehängte.

Die Achsenbezeichnungen ergeben hier keinen Sinn: Sie gehen von 10 ^ 1 bis 10 ^ 3. Was ist hier los?

Ich führe unten ein ausführlicheres Beispiel ein, das all diese Probleme mit Daten zeigt:

%Vor%

Dies ergibt die folgende Grafik:

Im ersten Teilplot von links haben wir die rohen, nicht protokollierten Daten. In der Sekunde haben wir die Standardansicht der Werte protokolliert. Als drittes haben wir Werte mit angegebenen x / y-Limits protokolliert. Meine Fragen sind:

  1. Warum sind die Standard-X / Y-Grenzen für das Streudiagramm falsch? Das Handbuch sagt, es sollte die Min- und Max-Werte in den Daten verwenden, aber das ist hier offensichtlich nicht der Fall. Es wurden Werte ausgewählt, die die große Mehrheit der Daten verbergen.

  2. Warum ist es so, dass wenn ich die Grenzen selbst setze, im dritten Streudiagramm von links, die Reihenfolge der Beschriftungen umkehrt? Zeige 2 ^ 8 vor 2 ^ 5? Es ist sehr verwirrend.

  3. schließlich, wie kann ich es bekommen, so dass die Plots nicht wie das standardmäßig mit Subplots gequetscht werden? Ich wollte, dass diese Streudiagramme quadratisch sind.

EDIT: Danke an Joe und Honk für die Antwort. Wenn ich versuche, Subplots wie dieses zu quadrieren:

%Vor%

Ich bekomme das Ergebnis unten:

Wie kann ich erreichen, dass jedes Diagramm quadratisch und ausgerichtet ist? Es sollte nur ein Raster aus Quadrat sein, alle gleich groß ...

EDIT 2:

Um etwas zurückzubringen, hier ist, wie man diese Log-2-Plots nehmen und die Achsen mit ihrer Nicht-Exponenten-Notation erscheinen lassen würde:

%Vor%

Danke für Ihre Hilfe.

    
user248237dfsf 17.01.2012, 00:31
quelle

2 Antworten

12

@honk hat Ihre Hauptfrage bereits beantwortet, aber wie für die anderen (und Ihre ursprüngliche Frage), lesen Sie bitte ein paar Tutorials oder werfen Sie einen Blick auf einige Beispiele. :)

Sie werden sehr verwirrt, weil Sie die Dokumentation für die Funktionen, die Sie verwenden, nicht angeschaut haben.

  

Warum sind die Standard-X / Y-Grenzen für das Streudiagramm falsch? das Handbuch   sagt, es soll die minimalen und maximalen Werte in den Daten verwenden, aber dies   ist hier offensichtlich nicht der Fall. Es wählte Werte aus, die das Weite verbergen   Mehrheit der Daten.

In der Dokumentation heißt das sicher nicht.

Standardmäßig "matplotlib" wird auf die nächsten "geraden" Zahlen für Plot-Grenzen "gerundet". Im Falle eines Log-Plots ist dies die nächstliegende Potenz der Basis.

Wenn Sie möchten, dass das Minimum und das Maximum der Daten genau festgelegt werden, geben Sie Folgendes an:

%Vor%

oder äquivalent

%Vor%
  

Warum ist es so, dass wenn ich die Grenzen selbst setze, im dritten Streudiagramm von links, die Reihenfolge der Beschriftungen umkehrt? Vorher 2 ^ 8 anzeigen   2 ^ 5? Es ist sehr verwirrend.

Es ist nicht. Es zeigt 2 ^ -8 vor 2 ^ 5. Sie haben einfach zu viele Beschriftungen, in die Sie hineinquetschen. Die Minuszeichen in den Exponenten werden durch überlappenden Text verdeckt. Versuchen Sie, die Größe der Zeichnung zu ändern oder plt.tight_layout() aufzurufen (oder ändern Sie die Schriftgröße oder die dpi-Zahl. Das Ändern der dpi ist eine schnelle Möglichkeit, alle Schriftarten auf dem gespeicherten Bild größer oder kleiner zu machen.)

  

endlich, wie kann ich es bekommen, damit die Plots nicht so zerquetscht werden   Standardmäßig Subplots verwenden? Ich wollte, dass diese Streudiagramme quadratisch sind.

Es gibt mehrere Möglichkeiten, dies zu tun, je nachdem, was Sie mit "Quadrat" meinen. (d. h. möchten Sie, dass das Seitenverhältnis der Grafik variiert oder die Grenzwerte?)

Ich nehme an, Sie meinen beide, in diesem Fall würden Sie adjustable='box' und aspect='equal' an plt.subplot weitergeben. (Sie können es auch später auf verschiedene Arten einstellen, ( plt.axis('equal') etc))

Als Beispiel für alles oben genannte:

%Vor%

Wenn Sie möchten, dass Ihre Plotkonturen genau die gleiche Größe und Form haben, dann ist es am einfachsten, die Bildgröße auf ein geeignetes Verhältnis zu ändern und dann adjustable='datalim' zu verwenden.

Wenn Sie vollständig verallgemeinert werden möchten, fügen Sie einfach die Unterachsen manuell hinzu, anstatt ein Unterdiagramm zu verwenden.

Wenn es Ihnen aber nichts ausmacht, die Größe der Figur anzupassen und / oder subplots_adjust zu verwenden, dann ist es einfach, dies zu tun und trotzdem Subplots zu verwenden.

Grundsätzlich würden Sie etwas wie

tun %Vor%

Und dann weiter wie zuvor.

Für das vollständige Beispiel:

%Vor%

    
Joe Kington 17.01.2012, 01:29
quelle
4

Sie verwirren, welche Einheiten xlim und ylim enthalten. Sie sollten nicht xlim(log10(min), log10(max)) heißen, sondern nur xlim(min, max) . Sie behandeln die niedrigsten und höchsten Werte, die Sie auf Ihren Achsen haben wollen, und zwar in Einheiten von x und y .

Die seltsame Anzeige scheint mir ein Fehler zu sein, den Sie auslösen, da Sie auf einer logarithmischen Skala ein negatives Minimum anfordern, das nicht angezeigt werden kann ( log(x)>0 für alle x ).

    
Benjamin Bannier 17.01.2012 00:58
quelle

Tags und Links