Finde den Bereich zwischen zwei Kurven, die in Matplotlib (fill_between area) geplottet sind

8

Ich habe eine Liste von x- und y-Werten für zwei Kurven, die beide seltsame Formen haben, und ich habe für keine von ihnen eine Funktion. Ich muss zwei Dinge tun: (1) zeichne es und schattiere den Bereich zwischen den Kurven wie das Bild unten; (2) finde die Gesamtfläche dieses schattierten Bereichs zwischen den Kurven.

Ich kann den Bereich zwischen diesen Kurven mit fill_between und fill_betweenx in Matplotlib plotten und schattieren, aber ich habe keine Ahnung, wie ich den genauen Bereich zwischen ihnen berechnen soll, besonders weil ich keine Funktion für irgendwas davon habe diese Kurven.

Irgendwelche Ideen?

Ich habe überall gesucht und kann dafür keine einfache Lösung finden. Ich bin ziemlich verzweifelt, also wird jede Hilfe sehr geschätzt.

Vielen Dank!

BEARBEITEN: Für zukünftige Referenz (falls jemand auf das gleiche Problem stößt), hier ist, wie ich das gelöst habe (viele Monate später): verband den ersten und letzten Knoten / Punkt jeder Kurve zusammen Das Ergebnis ist ein großes, seltsam geformtes Polygon, das dann formschön verwendet wird, um den Bereich des Polygons automatisch zu berechnen die Kurven, egal wie sie verlaufen oder wie nichtlinear sie sind. Funktioniert wie ein Zauber, lief schon für Tausende von Kurven. :)

Hier ist mein Code:

%Vor%     
F4R 22.08.2014, 03:49
quelle

3 Antworten

2

Die Flächenberechnung ist in Blöcken, in denen sich die beiden Kurven nicht schneiden, geradlinig: das ist das Trapez, wie oben ausgeführt wurde. Wenn sie sich schneiden, erstellen Sie zwei Dreiecke zwischen x [i] und x [i + 1], und Sie sollten die Fläche der beiden hinzufügen. Wenn Sie es direkt machen wollen, sollten Sie die beiden Fälle getrennt behandeln. Hier ist ein grundlegendes Arbeitsbeispiel zur Lösung Ihres Problems. Zuerst werde ich mit einigen gefälschten Daten beginnen:

%Vor%

Jetzt der Hauptcode. Basierend auf Ihrem Plot sieht es so aus, als hätten Sie y1 und y2 an den gleichen X-Punkten definiert. Dann definieren wir

%Vor%

cross_test ist immer dann negativ, wenn sich die beiden Graphen kreuzen. An diesen Punkten wollen wir die x-Koordinate der Frequenzweiche berechnen. Der Einfachheit halber werde ich x Koordinaten des Schnittpunkts aller Segmente von y berechnen. Für Orte, wo sich die beiden Kurven nicht schneiden, werden sie nutzlose Werte sein, und wir werden sie nirgends verwenden. Dadurch bleibt der Code einfacher zu verstehen.

Angenommen, Sie haben z1 und z2 bei x1 und x2, dann lösen wir für x0, so dass z = 0:

%Vor%

Wo sich die Kurven nicht schneiden, wird der Bereich einfach wie folgt angegeben:

%Vor%

Wo sie sich schneiden, fügen wir Bereiche beider Dreiecke hinzu:

%Vor%

Nun muss der Bereich in jedem Block x [i] bis x [i + 1] ausgewählt werden, für den ich np.where:

verwende %Vor%

Das ist Ihre gewünschte Antwort. Wie oben ausgeführt, wird dies komplizierter, wenn die beiden y-Graphen an verschiedenen x-Punkten definiert sind. Wenn Sie das testen möchten, können Sie es einfach grafisch darstellen (in meinem Testfall wird der y-Bereich zwischen -20 und 20 liegen)

%Vor%     
VBB 22.08.2014, 13:08
quelle
3

Definieren Sie Ihre zwei Kurven als Funktionen f und g , die linear sind, z. zwischen x1 und x2 , f(x) = f(x1) + ((x-x1)/(x2-x1))*(f(x2)-f(x1)) . Definieren Sie h(x)=abs(g(x)-f(x)) . Verwenden Sie dann scipy.integrate.quad , um h zu integrieren.

Auf diese Weise müssen Sie sich nicht um die Kreuzungen kümmern. Es wird die "trapez summing" automatisch von ch41rmn vorgeschlagen.

    
JulienD 22.08.2014 04:33
quelle
2

Ihre Datenmenge ist ziemlich "nett" in dem Sinne, dass die zwei Datensätze denselben Satz von x-Koordinaten teilen. Sie können daher die Fläche mit einer Reihe von Trapezen berechnen.

z.B. Definieren Sie die beiden Funktionen als f (x) und g (x), dann haben Sie zwischen zwei beliebigen Punkten in x vier Datenpunkte:

%Vor%

Dann ist der Bereich des Trapezes

%Vor%

Eine Komplikation ergibt sich daraus, dass Gleichung (1) nur für einfach verbundene Regionen funktioniert, d. h. es darf kein Crossover innerhalb dieser Region geben:

%Vor%

Die Fläche der beiden Seiten der Kreuzung muss separat ausgewertet werden. Sie müssen Ihre Daten durchgehen, um alle Schnittpunkte zu finden, und dann ihre Koordinaten in Ihre Koordinatenliste einfügen. Die richtige Reihenfolge von x muss beibehalten werden. Dann können Sie Ihre Liste der einfach verbundenen Regionen durchlaufen und eine Summe der Fläche der Trapeze erhalten.

BEARBEITEN:

Wenn die X-Koordinaten für die zwei Listen unterschiedlich sind, können Sie aus Neugierde stattdessen Dreiecke konstruieren. z.B.

%Vor%

Überlappungen zwischen Dreiecken müssen vermieden werden, so dass Sie wiederum Schnittpunkte suchen und in Ihre geordnete Liste einfügen müssen. Die Längen jeder Seite des Dreiecks können mit der Formel von Pythagoras berechnet werden, und die Fläche der Dreiecke kann mit der Heron-Formel berechnet werden.

    
ch41rmn 22.08.2014 04:20
quelle

Tags und Links