2017-08-24 2 views
0

Ich habe an einigen Daten Plotten für Python funktioniert und ein solches Werkzeug, das ich für meine Forschung brauche, ist eine Reihe von Differenzdiagrammen, um die Änderungen zwischen zwei Datensätze zu vergleichen.Matplotlib benutzerdefinierte divergierende Farbverlauf ignorieren Farben

Ich bin jetzt an dem Punkt, wo ich meine Daten plotten möchte und ich habe in die Erstellung von benutzerdefinierten Farbkarten zur Handhabung der divergierenden Daten, aber alle meine Plots so weit sind entweder ignoriert bestimmte Schritte in meinem Farbverlauf, oder Die Farben werden für meine niedrigen Werte wiederholt.

Hier ist ein Beispiel Plot, der generiert wurde: enter image description here

Und der Code für meine eigene Farbkarte, sowie das Plotten:

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF"] 
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17) 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
cs = m.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap) #plot total 

Mein Ziel ist es, die Farbkarte zu haben, der Nullpunkt muss weiß sein und dann nach außen divergieren (Rot negativ, Blau positiv). Momentan verwende ich eine Standard-Farbkarte, aber die Verwendung einer benutzerdefinierten Farbvorlage würde bevorzugt.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

+2

Ihre Daten sind wahrscheinlich nicht das, was Sie glauben, dass es ist. Schwer zu helfen ohne [mcve] ... – Julien

+2

Ich stimme @Julien zu. Von dem, was Sie in Ihrem Bild zeigen, haben Sie wahrscheinlich ein paar extreme Werte, die schwer zu sehen sind und der Rest Ihrer Daten liegen im Bereich zwischen -1 und 1. Haben Sie versucht, die Grenzen zu ändern ('vmin' und' vmax '). Auch wenn Ihre Daten in einem der Standardformate wie netcdf vorliegen, gibt es viele Tools, mit denen Sie Ihre Dateien schnell betrachten können. Bei netcdf-Dateien z. B. prüfe ich meine Daten gerne mit 'ncview' vor. –

+0

Im Gegensatz zu den Kommentaren von @Thomas und Julien ist das Problem primär unabhängig von den Daten, da die Ebenen explizit angegeben sind. Es ist lediglich eine Frage, wie der zu verwendende Farbenbereich definiert wird. Zwei Optionen werden in meiner Antwort unten gezeigt. Die Tatsache, dass die vollständige Karte die gleiche Farbe hat, würde dann aber auch engere Ebenen ermöglichen (von -10 bis 10 reicht wahrscheinlich aus). Beachten Sie jedoch, dass Julien völlig Recht damit hat zu sagen, dass ein [mcve] gegeben werden sollte, wenn man eine Frage wie diese stellt (bitte denken Sie daran, beim nächsten Mal nachzufragen). – ImportanceOfBeingErnest

Antwort

1

Das Problem besteht darin, dass die Farben aus der Colormap ausgewählt werden, indem der Bereich zwischen den Mindest- und Höchstwerten in gleiche Teile geteilt wird. Da die meisten Ebenen sehr nahe beieinander liegen, fallen sie in den gleichen Bereich und haben somit die gleiche Farbe.

Die einfachste Lösung besteht nicht darin, eine Colormap zu verwenden, sondern in einem Diagramm, in dem jede Ebene ihre Farbe aus der Farbliste erhält. In diesem Fall können Sie die Liste der Farben direkt dem contourf Grundstück zur Verfügung stellen.

Beachten Sie, dass, weil Sie 19 Stufen haben, Ihre Liste dann 18 Farben benötigen würde (ich fügte also eine hinzu).

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.colors 

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3)) 
r = np.sqrt(x**2+y**2) 
data = np.tan((r*0.7-1.5))*1.3 

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
       "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
       "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"] 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
        0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
cs = plt.contourf(x,y,data,contour_levels,colors=diffmap_17) 

plt.colorbar(cs) 

plt.show() 

enter image description here

Wenn Sie stattdessen eine colormap verwenden, müssten Sie eine Normalisierung Instanz zusammen mit dem colormap bereitzustellen. A matplotlib.colors.BoundaryNorm würde die Farben entsprechend der Liste der Grenzen auswählen, die an sie geliefert werden, was die Liste der Ebenen für das Konturdiagramm wäre.

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.colors 

x, y= np.meshgrid(np.linspace(-3,3), np.linspace(-3,3)) 
r = np.sqrt(x**2+y**2) 
data = np.tan((r*0.7-1.5))*1.3 

diffmap_17 = ["#FF0000", "#F81318", "#F12731", "#EB3B4A", "#EB5C66", "#EB7D82", 
       "#EB9E9E", "#F1BEBE", "#F8DEDE", "#FFFFFF", "#DDDCFD", "#BCB9FB", 
       "#9B96FA", "#6A6CFA", "#3A43FA", "#1D21FC", "#0000FF", "#0000ce"] 
diffmap_17_colormap = matplotlib.colors.ListedColormap(diffmap_17) 

contour_levels = [-20, -10, -5, -2, -1, -0.75, -0.5, -0.25, -0.1, 0.0, 
        0.1, 0.25, 0.5, 0.75, 1, 2, 5, 10, 20] 
norm = matplotlib.colors.BoundaryNorm(contour_levels, diffmap_17_colormap.N) 
cs = plt.contourf(x,y,data,contour_levels,cmap=diffmap_17_colormap, norm=norm) 

plt.colorbar(cs) 

plt.show() 

Die Ausgabedarstellung ist die gleiche wie oben.

+0

Ich denke, der Grund, warum das OP nur 17 Farbstufen hatte, ist, weil er die Ebenen 'auf die Farben zentriert' haben möchte, dh die tatsächlichen Konturen würden zwischen den definierten Ebenen und den Ticks auf dem Farbbalken liegen. - das ist zumindest was ich möchte. Dies ist besonders für den Weißwert sehr sinnvoll, da dann "vernachlässigbare" Werte (nahe Null) keine Tendenz zeigen. Vielleicht kann das OP das dazu kommentieren ... Anyway +1 von mir. –

+0

@Thomas Korrekt, die Grenzen symmetrisch um Null zu setzen, macht oft mehr Sinn; aber dazu müsste man ja die Daten interpretieren und an diesem Punkt bin ich schon verloren, in wie weit es negativen Niederschlag geben kann (könnte das sein, wenn mehr Wasser verdunstet als Regen fällt oder so und dann die Tendenz zeigen könnte gewünscht). – ImportanceOfBeingErnest

+0

Was das OP zeigt, ist ein Differenzdiagramm - zwei Modellläufe mit unterschiedlichen Einstellungen oder möglicherweise unterschiedlichen Algorithmen zur Berechnung der Niederschlagsmenge. Bei der Entwicklung solcher Modelle machen Sie so etwas häufig. Wie auch immer, Sie haben Recht, es liegt außerhalb des Rahmens dieser Frage. –