Автономная цветовая панель (matplotlib)

Я рисую некоторые графики на python с matplotlib и буду включать их в бумагу LaTeX (используя LaTex красивое выравнивание таблиц вместо того, чтобы возиться с matplotlib ImageGrid и т.д.). Я хотел бы создать и сохранить отдельный цветной бар с savefig, не используя imshow.

(параметры vlim, vmax, а также cmap могут быть указаны явно)

Единственный способ, который я мог найти, был довольно сложным и (из того, что я понимаю) рисует на холсте прямоугольник с жестким кодированием: http://matplotlib.org/examples/api/colorbar_only.html

Есть ли элегантный способ создания отдельного colorbar с matplotlib?

Ответ 1

Вы можете создать некоторое фиктивное изображение, а затем спрятать его топор. Нарисуйте цветную панель в настройках осей.

import pylab as pl
import numpy as np

a = np.array([[0,1]])
pl.figure(figsize=(9, 1.5))
img = pl.imshow(a, cmap="Blues")
pl.gca().set_visible(False)
cax = pl.axes([0.1, 0.2, 0.8, 0.6])
pl.colorbar(orientation="h", cax=cax)
pl.savefig("colorbar.pdf")

результат:

enter image description here

Ответ 2

Используя ту же идею, что и в ответе HYRY, если вы хотите "автономную" цветную панель в том смысле, что она не зависит от элементов на рисунке (не напрямую связанных с тем, как они окрашены), вы можете сделать что-то вроде следующее:

from matplotlib import pyplot as plt
import numpy as np

# create dummy invisible image
# (use the colormap you want to have on the colorbar)
img = plt.imshow(np.array([[0,1]]), cmap="Oranges")
img.set_visible(False)

plt.colorbar(orientation="vertical")

# add any other things you want to the figure.
plt.plot(np.random.rand(30))

Ответ 3

Итак, на основе этого ответа здесь, если вы похожи на меня и хотите избежать этой уродливой подделки plt.imshow(), вы можете сделать это в основном две строки:

import matplotlib as mpl
import matplotlib.pyplot as plt


fig, ax = plt.subplots()
col_map = plt.get_cmap('nipy_spectral')
mpl.colorbar.ColorbarBase(ax, cmap=col_map, orientation = 'vertical')

# As for a more fancy example, you can also give an axes by hand:
c_map_ax = fig.add_axes([0.2, 0.8, 0.6, 0.02])
c_map_ax.axes.get_xaxis().set_visible(False)
c_map_ax.axes.get_yaxis().set_visible(False)

# and create another colorbar with:
mpl.colorbar.ColorbarBase(c_map_ax, cmap=col_map, orientation = 'horizontal')

изображение итоговой фигуры