Matplotlib colorbar чередующиеся верхние нижние метки

Прежде всего, это было задумано как вопрос с автоответчиком, потому что я считаю, что это было бы полезно в определенных ситуациях, например. в этом сообщении автор попытался скрыть каждую другую метку, чтобы избежать перекрытия текстов, одним из альтернатив может быть чередование позиции ярлыка, чтобы сохранить все метки и избегания дублирования (если нет сумасшедшего количества ярлыков), что и должно решить этот пост:

Как сделать матричную панель matplotlib с чередующимися верхними и нижними метками?

Ответ 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().

Сюжет выглядит следующим образом: colorbar с верхними и нижними метками

РЕДАКТИРОВАТЬ: ВАЖНОЕ ОБНОВЛЕНИЕ К МОЕМУ ОТВЕТУ:

Когда цветная панель имеет расширение/переполнение, на соответствующем конце используется треугольник для указания переполнения значения. В таких случаях метки метки верхней строки нуждаются в некоторой настройке для правильного выравнивания с разделами цветовой панели.

По умолчанию размер треугольника составляет 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)

Ответ 2

Вы можете добавить объект с двумя осями и установить все нечетные тики там, установив каждый тик на исходные оси.

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 с нижней нижней меткой

НТН