Ответ 1
Перейти к простому рабочему примеру:
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)
В основном нижние метки отображаются с использованием метода по умолчанию cbar.ax.set_xticklabels(lbot)
. Для верхних меток я добавил их вручную, используя cbar.ax.text()
.
Сюжет выглядит следующим образом:
РЕДАКТИРОВАТЬ: ВАЖНОЕ ОБНОВЛЕНИЕ К МОЕМУ ОТВЕТУ:
Когда цветная панель имеет расширение/переполнение, на соответствующем конце используется треугольник для указания переполнения значения. В таких случаях метки метки верхней строки нуждаются в некоторой настройке для правильного выравнивания с разделами цветовой панели.
По умолчанию размер треугольника составляет 5% от оси colorbar, это используется для получения правильного смещения и масштабирования для выравнивания меток.
См. пример ниже, который распространяется на обоих концах. Используя мой предыдущий метод, результат выглядит следующим образом:
2 конечных числа в верхней строке выровнены с концом треугольников. Если только один конец расширяется и число уровней контура велико ( >= 10 или около того), смещение будет ухудшаться.
И это код для создания правильного сюжета:
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)