Kann ich mit matplotlib.units zwischen den in einer Grafik angezeigten Einheiten wechseln?

8

Ich benutze Matplotlib, um Graphen in einer Desktop-Anwendung zu rendern, und ich bin ein wenig verwirrt über die Unterstützung von Einheiten durch Matplotlib. Ich möchte den Benutzer die Einheiten ändern lassen, die auf der x Achse eines Graphen angezeigt werden: Alle Berechnungen werden in Nanometer durchgeführt, aber der Graph kann entweder in Nanometer oder Gigahertz angezeigt werden. (Beachten Sie, dass zwischen diesen beiden Einheiten eine inverse, nicht lineare Beziehung besteht.)

Es gibt zwei offensichtliche Wege, dies zu tun: "manuell" oder mit matplotlib. Im ersten Fall würde Matplotlib nichts über Einheiten wissen; Wenn der Benutzer die Einheiten änderte, würde ich einfach alle meine Datenpunkte neu berechnen, die Grenzen und Beschriftungen der Achsen ändern und matplotlib neu zeichnen. Aber ich hoffe, dass Matplotlib eingebaute Funktionalität hat, um das Gleiche zu tun.

Es gibt einige Lichtdokumentationen zu matplotlib.units , aber soweit ich das beurteilen kann, ist dies zum Zeichnen von Arrays gedacht von benutzerdefinierten Objekten anstelle von Arrays von zum Beispiel Floaten. Meine Daten sind tatsächlich ein Array von Gleitkommazahlen, und da es hunderttausende Datenpunkte pro Graph gibt, kann ich nicht jeden Wert in einer benutzerdefinierten Modellklasse umbrechen. (Sogar dieses einfache Beispiel umschließt jeden Datenpunkt in einer Modellklasse und das gesamte Beispiel ist so generisch, dass ich ' t sagen, wie ich es für meine Bedürfnisse anpassen würde.) In jedem Fall haben die ursprünglichen Datenpunkte immer die gleichen Einheiten, so dass die Werte immer nur in eine andere Einheit umgewandelt werden müssen

>

Wie kann ich Matplotlib über meine Einheiten erkennen und dann einfach axes.set_xunit oder etwas verwenden, um zwischen ihnen zu wechseln?

    
bdesham 21.01.2014, 23:26
quelle

2 Antworten

2

Ich konnte keinen befriedigenden Weg finden, dies mit matplotlib zu tun. Ich wollte nicht, dass jeder Datenwert in einem Objekt verpackt wird. Ich entschied mich, die Einheitenumrechnung selbst vorzunehmen, bevor ich die Daten an matplotlib übergab.

    
bdesham 08.08.2014, 02:07
quelle
2

Versuchen Sie, eine Funktion anstelle eines Floats zur Konvertierung zu verwenden.

Das folgende Beispiel könnte als Start dienen. Gigahertz GHz ist per nanosecond und nm^-1 ist per nano meter , also würde dieses Beispiel nm^-1 ergeben, denke ich.

Ich nahm das mpl-Modell und machte drei Anpassungen:

Unterstützt eine aufrufbare Funktion für die Konvertierung

%Vor%

Definieren Sie die Funktion für die Konvertierung

%Vor%

Übergeben Sie es

%Vor%

Sie definieren einige Funktionen und zeichnen sie mit der entsprechenden Funktion neu auf. Oder - für die Komplikation - fügen Sie noch ein weiteres Argument hinzu und haben beide: Einen konstanten Skalierungsfaktor plus Funktion.

Das gesamte angepasste Beispiel aus Ссылка :

%Vor%     
embert 26.01.2014 10:10
quelle

Tags und Links