2016-05-11 7 views
0

Zuallererst war dies als eine Frage zur Selbstbeantwortung gedacht, weil ich glaube, dass es in bestimmten Situationen hilfreich wäre, z.B. in this post der Autor versucht, verstecken jedes andere Etikett zu vermeiden Texte überlappend, eine Alternative könnte die Position des Etiketts wechseln, so dass man alle Etiketten behält und vermeidet Überschneidungen (wenn es nicht eine verrückte Anzahl von Etiketten) auch, was ist das, was dieser Beitrag zu lösen versucht:matplotlib colorbar alternierend top bottom labels

Wie matplotlib Farbbalken mit wechselnden oberen und unteren Etiketten machen?

Antwort

0

Wechseln zu einem einfachen Arbeitsbeispiel:

import numpy 
import matplotlib.pyplot as plt 

#------------------Get some data------------------ 
X = numpy.arange(100) 
Y = numpy.arange(100) 
Z = numpy.arange(100**2).reshape((100,100)) 

levels=numpy.arange(0,100**2,1000) 
ltop=levels[::2]   # labels appear on top 
lbot=levels[1:][::2]  # labels appear at bottom 

#-----------------------Plot----------------------- 
f = plt.figure() 
ax = f.gca() 

cf = ax.contourf(X,Y,Z,100) 
cbar=plt.colorbar(cf,orientation='horizontal',ticks=lbot,drawedges=True) 

vmin=cbar.norm.vmin 
vmax=cbar.norm.vmax 

#-------------Print bottom tick labels------------- 
cbar.ax.set_xticklabels(lbot) 

#--------------Print top tick labels-------------- 
for ii in ltop: 
    cbar.ax.text((ii-vmin)/(vmax-vmin), 1.5, str(ii), transform=cbar.ax.transAxes, va='bottom', ha='center') 

plt.show(block=False) 

Grundsätzlich sind die unteren Etiketten aufgetragen sind cbar.ax.set_xticklabels(lbot) das Standardverfahren. Für die oberen Etiketten habe ich sie manuell mit cbar.ax.text() hinzugefügt.

Das Grundstück sieht wie folgt aus: colorbar with top and bottom labels

EDIT: WICHTIG UPDATE ZU MEINER ANTWORT:

Wenn die colorbar hat ausfahren/Überlauf, ein Dreieck auf dem jeweiligen Ende verwendet wird Wertüberlauf, um anzuzeigen, . In solchen Fällen müssen die oberen Hilfsstrichbeschriftungen angepasst werden, um sie korrekt an den Farbbalkenabschnitten auszurichten.

Standardmäßig ist die Dreiecksgröße 5% der Farbbalkenachse, dies wird verwendet, um den korrekten Offset und die Skalierung zum Ausrichten der Beschriftungen zu erhalten.

Siehe unten ein Beispiel, das sich an beiden Enden erstreckt. Unter Verwendung meiner früheren Verfahren, sieht das Ergebnis wie folgt aus:

enter image description here

Die 2 Endnummern am oberen Zeile sind mit der Spitze der Dreiecke ausgerichtet ist. Wenn nur ein Ende verlängert ist und die Anzahl der Konturniveaus groß ist (> = 10 oder so), wird die Fehlausrichtung schlechter.

Die Handlung nach der Korrektur: enter image description here

Und das ist der Code die richtige Handlung zu generieren:

import numpy 
import matplotlib.pyplot as plt 

#------------------Get some data------------------ 
X = numpy.linspace(-1,1,100) 
Y = numpy.linspace(-1,1,100) 
X,Y=numpy.meshgrid(X,Y) 
Z=numpy.sin(X**2) 

levels=numpy.linspace(-0.8,0.8,9) 

ltop=levels[::2]   # labels appear on top 
lbot=levels[1:][::2]  # labels appear at bottom 

#-----------------------Plot----------------------- 
f = plt.figure() 
ax = f.gca() 

cf = ax.contourf(X,Y,Z,levels,extend='both') 
cbar=plt.colorbar(cf,orientation='horizontal',ticks=lbot,drawedges=True) 

#------------Compute top tick label locations------------ 
vmin=cbar.norm.vmin 
vmax=cbar.norm.vmax 

if cbar.extend=='min': 
    shift_l=0.05 
    scaling=0.95 
elif cbar.extend=='max': 
    shift_l=0. 
    scaling=0.95 
elif cbar.extend=='both': 
    shift_l=0.05 
    scaling=0.9 
else: 
    shift_l=0. 
    scaling=1.0 

#-------------Print bottom tick labels------------- 
cbar.ax.set_xticklabels(lbot) 

#--------------Print top tick labels-------------- 
for ii in ltop: 
    cbar.ax.text(shift_l + scaling*(ii-vmin)/(vmax-vmin), 
     1.5, str(ii), transform=cbar.ax.transAxes, 
     va='bottom', ha='center') 

plt.show(block=False) 
0

Sie könnten ein Doppelachsen Objekt hinzufügen und alle ungeraden Zecken dort eingestellt, während jede gerade Einstellung tickt auf den ursprünglichen Äxten.

import numpy as np 
import matplotlib.pyplot as plt 

# Make the plot 
fig, ax = plt.subplots(1,1, figsize=(5,5)) 
fig.subplots_adjust(bottom=0.2) 
## Trick to have the colorbar of the same size as the plot 
box = ax.get_position() 
cax = fig.add_axes([box.xmin, box.ymin - 0.1, box.width, 0.03]) 
m = ax.matshow(np.random.random(100).reshape(10,10), aspect="auto") # Don't forget auto or the size of the heatmap will change. 
cb = plt.colorbar(m, cax=cax, orientation="horizontal") 

# Add twin axes 
cax2 = cax.twiny() 

# get current positions and values of the ticks. 
# OR you can skip this part and set your own ticks instead. 
xt = cax.get_xticks() 
xtl = [i.get_text() for i in cax.get_xticklabels()] 

# set odd ticks on top (twin axe) 
cax2.set_xticks(xt[1::2]) 
cax2.set_xticklabels(xtl[1::2]) 
# set even ticks on original axes (note the different object : cb != cax) 
cb.set_ticks(xt[::2]) 
cb.set_ticklabels(xtl[::2]) 

colorbar with label top bottom

HTH