Ich benutze Matplotlib 1.3.0 und ich habe folgendes:
%Vor%welches produziert:
Das bisschen, was ich nicht verstehe, ist wo sind all die anderen Farben hin? Wie ich es verstehe, sollte vmin=0
, vmax=3
angegeben werden, dann sollte der Farbbalken den vollen Bereich von cmap
wie in diesem Bild verwenden:
, das ohne Angabe der Argumente vmin
, vmax
und levels
erstellt wird. Also ... was fehlt mir hier?
BEARBEITEN 1
Als Antwort auf tom10 & amp; tcaswell. Ich hätte erwartet, dass es so ist wie du sagst, aber ... leider nicht. Sieh dir das an:
%Vor%mit:
Vielleicht, um dies ein wenig zu verdeutlichen: Sagen wir, dass ich Daten habe und die wichtigen Merkmale davon sind ungefähr 0.1, aber es gibt ungefähr 3, sagen wir mal. Also gebe ich ein levels=[0, 0.005, 0.075, 0.1, 0.125, 0.15, 0.2, 1, 2.5, 2.75, 3, 3.25]
und vmin=0, vmax=3.25
. Jetzt würde ich erwarten, dass die gesamte Farbpalette angezeigt wird, aber alle wichtigen Datenpunkte 0.005 bis 0.125 landen im blauen Bereich (mit der Standard-Farbkarte plt.cm.jet
). Was ich sage, denke ich ist ... wenn ich levels=[0, 1, 2, 3], vmin=0, vmax=3
für einige Daten gebe, die von 0 bis 3 gehen, erwarte ich, alle Farben in der gegebenen Farbkarte zu sehen, aber wenn ich levels=[0, 0.9, 0.1, 0.11, 1, 3], vmi=0, vmax=3
gebe, würde ich das erwarten Um alle Farben in der gegebenen Farbkarte zu sehen, außer auf die richtigen Intervalle abgebildet, sehe ich stattdessen die Blautöne, die die 0-0.11-Region färben und etwas grün / gelb, das den anderen Teil der Region einfärbt. Hoffe, das macht es ... ein bisschen klar.
BEARBEITEN 2
Das gleiche passiert auch, wenn ich keine norm
oder vmin, vmax
gebe.
EDIT 3
Wenn wir uns auf den Kommentar von tcaswell beziehen, ist es zumindest kontraintuitiv, sich so zu verhalten, wie es ist. Ich habe erwartet, dass die Farbe in gewisser Weise unabhängig von den Datenpunkten ist. Ich würde erwarten, dass die ganze Palette von Farben aus der Colormap die ganze Zeit verwendet wird (außer wenn die vmin, vmax
größer / kleiner als die levels
min, max Werte sind). Mit anderen Worten, mit Blick auf diesen Code habe ich eine Weile zurück (Python 3):
verwende es dann als:
%Vor% gibt die Grafik an, in der Sie die Merkmale (0,1-0,5) tatsächlich unterscheiden können, d. h., dass sie sich nicht mehr im blauen Bereich befinden, indem Sie die obige Methode mit plt.cm.jet
:
Ich meine, ich weiß, dass ich das gelöst habe, und auch eine Weile zurück ... aber meine Frage ist wohl ... wie kommt es, dass der Standard in Matplotlib nicht das ist? Ich hätte erwartet, dass es so ist ... oder ist es vielleicht nur eine Konfiguration / ein Argument / etwas, um dies standardmäßig zu aktivieren, das ich vermisse?
Nachdem ich ein bisschen herumgespielt habe, scheint die Antwort auf diese Frage viel einfacher zu sein, als ich jemals gedacht habe. Nur eine Erklärung zuerst. Beim Lesen der Dokumentation über die normalisierenden Klassen von matplotlib.colors
dachte ich ... nun, matplotlib.colors.BoundaryNorm
sollte hier verwendet werden! aber etwas stimmt nicht, wie Sie im folgenden Beispiel sehen können:
was folgendes gibt:
und das ist offensichtlich etwas, was wir nicht wollen! Und ich dachte ... wieso musst du dem Konstruktor von BoundaryNorm
die Anzahl der Farben geben? ... Sollte nicht BoundaryNorm
den vollen Umfang der Colormap benutzen? Und dann fiel es mir auf, mit nur ein wenig Änderung des obigen Codes:
und wir bekommen: was genau wir wollen!
Oder Sie können wir tun:
%Vor% Die Farbe der gefüllten Region wird durch den Mittelpunkt der beiden Linien ausgewählt, zwischen denen sie sich füllt (rechts). Das Gelb, das Sie sehen, ist das Mapping von 2
unter der Farbkarte und die von Ihnen gesetzten Grenzen.
Wenn Sie die Farbe nach Regionsindex abbilden möchten, machen Sie ein bisschen Affepatching:
%Vor%
Sie können wahrscheinlich besser machen und die Verschiebung um 1/2 entfernen.
Sie können auch die Farbe bestehender Konturen erreichen und ändern. Offenbar müssen Sie die Werte von out.cvalues
ändern und dann out.changed()
für das Objekt aufrufen.
Eine weniger zerstörerische Version wäre das Schreiben einer benutzerdefinierten norm
durch Unterklassierung von matplotlib.colors.Normalize
, siehe colors.py für eine Vorlage.
Der maximale Wert Ihrer Daten ist 2
. In dem fraglichen Diagramm legen Sie vmax=3
fest.
Genauer gesagt legt vmax
den Farbbereich fest, der im Mapping verwendet wird. Da dies viel größer als Ihr Datenbereich ist, sehen Sie beim Zeichnen der Daten nicht die gesamte Farbpalette. Dies wird zusätzlich durch die kleine Anzahl von levels
, die Sie ausgewählt haben, verwechselt, die nicht alle verfügbaren Farben anzeigt, da die Farbleiste nur eine einzige Farbe für den gesamten Bereich von 1 bis 3 zeigt, wiederum verdunkelnde Farben verfügbar über 2 hinaus.
Tags und Links matplotlib colorbar color-mapping