Добавить цветную панель к существующей оси

Я делаю некоторые интерактивные сюжеты, и я хотел бы добавить легенду цветового бара. Я не хочу, чтобы colorbar был в своих собственных осях, поэтому я хочу добавить его к существующим осям. У меня возникают трудности с этим, так как большая часть кода примера, который я нашел, создает новые оси для colorbar.

Я пробовал следующий код с помощью matplotlib.colorbar.ColorbarBase, который добавляет цветную панель к существующим осям, но это дает мне странные результаты, и я не могу понять, как указать атрибуты colorbar (например, где на оси размещены и какой размер)

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.cm import coolwarm
import numpy as np

x = np.random.uniform(1, 10, 10)
y = np.random.uniform(1, 10, 10)
v = np.random.uniform(1, 10, 10)

fig, ax = plt.subplots()

s = ax.scatter(x, y, c=v, cmap=coolwarm)

matplotlib.colorbar.ColorbarBase(ax=ax, cmap=coolwarm, values=sorted(v),
                                 orientation="horizontal")

Использование fig.colorbar вместо matplotlib.colorbar.ColorbarBase по-прежнему не дает мне совершенно то, что я хочу, и я до сих пор не знаю, как настроить атрибуты colorbar.

fig.colorbar(s, ax=ax, cax=ax)

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

Скажем, я хочу иметь цветную панель в левом верхнем углу, растянувшись примерно на полпути в верхней части сюжета. Как мне это сделать?

Мне лучше написать пользовательскую функцию для этого, возможно, используя LineCollection?

Ответы

Ответ 1

Цветная панель должна иметь свои собственные оси. Однако вы можете создать оси, которые перекрываются с предыдущей. Затем используйте cax kwarg, чтобы сообщить fig.colorbar использовать новые оси.

Например:

import numpy as np
import matplotlib.pyplot as plt

data = np.arange(100, 0, -1).reshape(10, 10)

fig, ax = plt.subplots()
cax = fig.add_axes([0.27, 0.8, 0.5, 0.05])

im = ax.imshow(data, cmap='gist_earth')
fig.colorbar(im, cax=cax, orientation='horizontal')
plt.show()

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

Ответ 2

Этот метод обычно используется для нескольких осей на фигуре. В этом контексте часто требуется иметь colorbar , который соответствует по размеру с результатом imshow. Это можно легко достичь с помощью набор осей сетки:

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

data = np.arange(100, 0, -1).reshape(10, 10)

fig, ax = plt.subplots()
divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)

im = ax.imshow(data, cmap='bone')

fig.colorbar(im, cax=cax, orientation='vertical')
plt.show()

Изображение с соответствующей цветной панелью размером