Как установить дискретные галочки на цветовой полосе в mpl_toolkits.axes_grid1.ImageGrid?

Я хочу установить дискретную цветовую полосу в ImageGrid.

Сетка изображений

Вот пример:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
import numpy as np
import matplotlib

lon,lat = np.meshgrid(np.arange(-180, 180, 10), np.arange(-85, 90, 10))
data = np.sort(np.random.rand(18, 36),axis=1)

fig = plt.figure()
grid = ImageGrid(fig, 111,
                nrows_ncols=(2, 1),
                axes_pad=(0.35, 0.35),
                label_mode="1",
                share_all=True,
                cbar_location="right",
                cbar_mode="each",
                cbar_size="5%",
                cbar_pad="6%",
                )

# Settings
bounds = [0,0.01,0.04,0.07,0.1,0.13,0.16,0.2,0.25,0.35,0.45,0.6,0.9]
colors = ['#390231','#7F1CAB','#0047FD','#0072FE','#019EFF','#00C4FF','#01EDFF',\
        '#00FFFB','#00FFC8','#29F905','#FBDD03','#FA0F00']

# Original colorbar
p = grid[0].pcolormesh(lon,lat,data, vmin=0, vmax=0.9, cmap='jet')
cb = grid.cbar_axes[0].colorbar(p)

# Defined colorbar
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(bounds, cmap.N)
p = grid[1].pcolormesh(lon,lat,data, cmap=cmap, norm=norm)
cb = grid.cbar_axes[1].colorbar(p, ticks=bounds)

grid[0].set_title('jet')
grid[1].set_title('Defined')
plt.show()

Вот результат: Test_grid

Как видите, расположение галочек неверное. Если галочки стоят на границах каждого цветового блока, вторая цифра будет выглядеть правильно.

Подсюжеты

Затем я протестировал subplots. Он отлично работает!

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

lon,lat = np.meshgrid(np.arange(-180, 180, 10), np.arange(-85, 90, 10))
data = np.sort(np.random.rand(18, 36),axis=1)

f, (ax1, ax2) = plt.subplots(1, 2,sharey=True)

# Settings
bounds = [0,0.01,0.04,0.07,0.1,0.13,0.16,0.2,0.25,0.35,0.45,0.6,0.9]
colors = ['#390231','#7F1CAB','#0047FD','#0072FE','#019EFF','#00C4FF','#01EDFF',\
        '#00FFFB','#00FFC8','#29F905','#FBDD03','#FA0F00']

# Defined colorbar
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(bounds, cmap.N)

# Jet
p = ax1.pcolormesh(lon,lat,data, vmin=0, vmax=0.9, cmap='jet')
f.colorbar(p,ax=ax1)
ax1.set_title('jet')

# Defined
p = ax2.pcolormesh(lon,lat,data, cmap=cmap, norm=norm)
f.colorbar(p,ax=ax2,ticks=bounds)
ax2.set_title('defined')

plt.show()

Вот результат: Подсюжеты

Одинокий

Я протестировал свой скрипт на одной фигуре. Он отлично работает!

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

lon,lat = np.meshgrid(np.arange(-180, 180, 10), np.arange(-85, 90, 10))
data = np.sort(np.random.rand(18, 36),axis=1)

fig = plt.figure()

# Settings
bounds = [0,0.01,0.04,0.07,0.1,0.13,0.16,0.2,0.25,0.35,0.45,0.6,0.9]
colors = ['#390231','#7F1CAB','#0047FD','#0072FE','#019EFF','#00C4FF','#01EDFF',\
        '#00FFFB','#00FFC8','#29F905','#FBDD03','#FA0F00']

# Defined colorbar
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(bounds, cmap.N)

# Jet
plt.pcolormesh(lon,lat,data, vmin=0, vmax=0.9, cmap='jet')
plt.colorbar()
plt.show()

# Defined
p = plt.pcolormesh(lon,lat,data, cmap=cmap, norm=norm)
plt.colorbar(p, ticks=bounds)
plt.title('Single fig')

plt.show()

Это результат одной цифры jet и defined: Jet < img src="https://i.stack.imgur.com/2JOvN.png" alt="определено">


person Xin Zhang    schedule 28.10.2018    source источник


Ответы (1)


Обходной путь — установить метки вручную.

ticks=np.linspace(bounds[0],bounds[-1], len(bounds))
cb = grid.cbar_axes[1].colorbar(p, ticks=ticks)
cb.ax.set_yticklabels(bounds)

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 29.10.2018