Установление лимитов на colorbar в библиотек matplotlib

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

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

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

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,)

enter image description here

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

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


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

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

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

...


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

опция уровня 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)