Добавление легенды в pcolor с помощью cs.cmap.set_under и.set_over

Я гуглил, как установить легенды в matplotlib pcolor, но я все еще не уверен и не нашел ссылок на то, как установить легенду для определенных цветов, которые я установил для .set_under а также .set_over
Возможно ли в этом случае иметь легенду и цветовую панель? Так как я сделал cmap.set_under(1) например, это означает, что я установил цветовую панель для отображения диапазона, отличного от легенды (которую мне еще предстоит выяснить, как добавить).

Я нашел пример здесь на https://matplotlib.org/examples/pylab_examples/image_masked.html который я немного уменьшил, чтобы лучше объяснить мой вопрос:

from copy import copy
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.mlab as mlab

x0, x1 = -5, 5
y0, y1 = -3, 3
x = np.linspace(x0, x1, 500)
y = np.linspace(y0, y1, 500)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 10*(Z2 - Z1)

cmap = copy(plt.cm.gray)
cmap.set_over('r', 1.0)
cmap.set_under('g', 1.0)
cmap.set_bad('b', 1.0)
Zm = np.ma.masked_where(Z > 1.2, Z)


fig, ax = plt.subplots()

im = ax.imshow(Zm, interpolation='bilinear',
                cmap=cmap,
                norm=colors.Normalize(vmin=-1.0, vmax=1.0),
                aspect='auto',
                origin='lower',
                extent=[x0, x1, y0, y1])

############
### Here a title is used instead of a legend
ax.set_title('Green=low, Red=high, Blue=masked')
### instead of a set_title above, I would like it to be a legend 
############
cbar = fig.colorbar(im, extend='both')

plt.show()

В этом примере есть заданный заголовок, чтобы объяснить непозволительные цвета. Однако вместо названия, как указано выше, я бы хотел, чтобы он был легендой.

1 ответ

Решение

Вы можете определить свою собственную легенду с Rectangles окрашены как значения over, under и bad, ранее установленные в colormap.

rect = lambda color: plt.Rectangle((0,0),1,1, color=color)
legend = ax.legend([rect("r"), rect("g"), rect("b")], ["high","low","masked"])

Другие вопросы по тегам