Установка ограничений на цветовую панель в matplotlib


Я видел так много примеров, которые просто не относятся к моему случаю. То, что я хотел бы сделать, это установить простое минимальное и максимальное значение для цветовой панели. Задать диапазон для изображения cmap легко, но это не относится к минимальному и максимальному значениям цветовой панели. Приведенный ниже код может объяснить:

triang = Triangulation(x,y)
plt.tricontourf(triang, z, vmax=1., vmin=0.)
plt.colorbar()

Цветовая полоса по-прежнему фиксирована в пределах данных z, хотя диапазон cmap теперь фиксирован между 0 и 1.

4 12

4 ответа:

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

data = np.tile(np.arange(4), 2)
fig = plt.figure()
ax = fig.add_subplot(121)
cax = fig.add_subplot(122)
cmap = colors.ListedColormap(['b','g','y','r'])
bounds=[0,1,2,3,4]
norm = colors.BoundaryNorm(bounds, cmap.N)
im=ax.imshow(data[None], aspect='auto',cmap=cmap, norm=norm)
cbar = fig.colorbar(im, cax=cax, cmap=cmap, norm=norm, boundaries=bounds, 
     ticks=[0.5,1.5,2.5,3.5],)
plt.show()

Вы видите, что вы можете установить bounds для цветов в colorbar и ТИКов.

Это не строго то, чего вы хотите достичь, но намек на рис может помочь.

Этот другой использует ticks а также определить масштаб colorbar.

import numpy as np
import matplotlib.pyplot as plt

xi = np.array([0., 0.5, 1.0])
yi = np.array([0., 0.5, 1.0])
zi = np.array([[0., 1.0, 2.0],
               [0., 1.0, 2.0],
               [-0.1, 1.0, 2.0]])

v = np.linspace(-.1, 2.0, 15, endpoint=True)
plt.contour(xi, yi, zi, v, linewidths=0.5, colors='k')
plt.contourf(xi, yi, zi, v, cmap=plt.cm.jet)
x = plt.colorbar(ticks=v)
print x
plt.show()

Я думал, что этот вопрос указывает на ошибку, но оказалось, что это ограничение использования/совместимости. Решение состоит в том, чтобы создать контуры для диапазона цветовой панели, который вы хотите, и использовать extend kwarg. Для получения дополнительной информации, взгляните на этот вопрос. Спасибо @tcaswell за предоставленное решение:

import matplotlib.pyplot as plt
import numpy as np

x, y = np.mgrid[0:1:0.01, 0:1:0.01]
r = np.sqrt(x ** 2 + y ** 2)
z = np.sin(6 * np.pi * r)

fig0, ax0 = plt.subplots(1, 1, )
cf0 = ax0.contourf(x, y, z, np.arange(0, .5, .01),
                   extend='both')
cbar0 = plt.colorbar(cf0,)

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

Отсюда, Если вам не нравятся тики colorbar, вы можете настроить их с помощью cbar0.set_ticks. Я проверил, что это также работает с tricontourf.

Я упростил код @tcaswell до того, что необходимо для получения желаемого результата. Кроме того, он использовал новую цветовую карту viridis, но, надеюсь, вы поняли идею.

Это, вероятно, самый простой метод.

...(ваш код, как показано)

plt.colorbar(boundaries=np.linspace(0,1,5)) 

...

Я столкнулся с той же проблемой и привел конкретный (хотя и бессмысленный) пример этой проблемы. Команда commented contourf создаст цветовую полосу, имеющую те же границы, что и данные, но не цветовые границы.

Опция level в tricontourf, по-видимому, является хорошим способом обойти это, хотя для включения значений, превышающих уровни в графике, требуется опция extend='both'.

import matplotlib.tri as mtri
import numpy as np
from numpy.random import randn
from matplotlib import colors

numpy.random.seed(0)
x = randn(300)
y = randn(300)
z = randn(*x.shape)
triangles = mtri.Triangulation(x, y)
bounds=np.linspace(-1,1,10)
# sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1.)
sc = plt.tricontourf(triangles, z, vmax=1., vmin=-1., levels = bounds,\
                    extend = 'both')
cb = colorbar(sc)
_ = ylim(-2,2)
_ = xlim(-2,2)