2017-11-10 5 views
1

Beim Erstellen von Farbbalken mit dem Objekt "ColorbarBase" und Hinzufügen von Ticks mit der Methode "set_yticklabels" zeigt matplotlib nur die Hälfte der in der Liste "ticks" angegebenen Werte an. Dies geschah erst nach dem Upgrade auf die neueste Version von Matplotlib. HierMatplotlib-Farbbalken zeigt nur bis zur Hälfte der Tick-Werte

ist nur ein kurzer Code zu testen:

import matplotlib.pyplot as plt 
    import matplotlib as mpl 
    fig = plt.figure(1) 
    cax = fig.add_axes([0.8, 0.15, 0.03, 0.72]) 
    ticks = range(11) 
    cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical') 
    cbar.ax.set_yticklabels(ticks) 
    plt.show() 

Mit matplotlib Version 2.1.0 Ich bekomme eine colorbar mit Zecken, die von 1 bis 5 gehen, mittlerweile mit matplotlib Version 1.4.3 ich die richtigen Zahlen mit Ticks, die von 1 bis 10 gehen.

Ich kann eine dreckige Korrektur vornehmen, indem ich den Tick-Bereich um zwei vergrößere, aber ich würde es vorziehen, dass dies nicht passiert. Irgendwelche Tipps zu was könnte los sein?

Antwort

0

Ich würde denken, dass der obige Code in Matplotlib 1.4 funktioniert, ist nur Zufall. Der Punkt ist, dass Sie der Farbleiste nicht mitteilen, welchen Bereich sie abdecken soll. Es würde daher den Bereich 0 - 1 abdecken. In Matplotlib-Versionen unter 2 würde eine Achse mit dem Bereich 0 - 1 11 Tickmarks haben (0,0.1,0.2,...); dann würde das Einstellen der Etiketten als range(11) gut passen (0 bleibt 0, 0,1 ist mit 1 bezeichnet, usw.). In neueren Matplotlib-Versionen ist die Beschriftungsdichte standardmäßig niedriger (0,0.2,0.4,...). Daher erhalten Sie nur die Bezeichnung bis zu 5 (0 bleibt 0, 0,2 ist mit 1, 0,4 mit 2 usw. bis 5 gekennzeichnet). Am Ende ist dieser Ansatz ohnehin sehr fragil, da die Tick-Dichte auch von der Größe der Achsen abhängt und sich ändern kann.

Sie möchten also der Farbleiste mitteilen, welchen Bereich sie abdecken soll. Eine Möglichkeit wäre, eine norm zu liefern.

ticks = range(11) 
cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical', 
           norm=plt.Normalize(ticks[0],ticks[-1])) 

Anschließend können Sie die Zecken und ticklabels auf die Zahlen innerhalb ticks.

cbar.set_ticks(ticks) 
cbar.ax.set_yticklabels(ticks) 

Komplettes Beispiel:

import matplotlib.pyplot as plt 
import matplotlib as mpl 
fig = plt.figure(1) 
cax = fig.add_axes([0.8, 0.15, 0.03, 0.72]) 
ticks = range(11) 
cbar = mpl.colorbar.ColorbarBase(cax, cmap='rainbow', orientation='vertical', 
           norm=plt.Normalize(ticks[0],ticks[-1])) 
cbar.set_ticks(ticks) 
cbar.ax.set_yticklabels(ticks) 
plt.show() 

enter image description here

+0

Vielen Dank für Ihre Antwort! Dies würde für den Großteil meines Codes funktionieren. –

+0

Warum nur die Mehrheit? Es ist allgemein gesagt, würde ich sagen. Wenn Sie weitere Erläuterungen benötigen, können Sie danach fragen. Vielleicht möchten Sie auch [jemand Antworten] (https://stackoverflow.com/help/someone-answers) lesen. – ImportanceOfBeingErnest

+0

Hey, tut mir leid, ich habe die Nachricht aus Versehen unvollendet gesendet und hatte keine Zeit, sie zu korrigieren. Es gibt einen Fall, in dem ich eine Zeichenfolge im letzten Tick verwenden möchte, um das Größer-oder-Gleich-Vorzeichen anzuzeigen (zum Beispiel "> = 10"). Die Verwendung von "plt.norm" gibt einen Fehler, weil es nur mit Zahlen funktioniert. Ist es möglich, dass Ihre Lösung in diesem Fall funktioniert? –

Verwandte Themen