Установка ограничений на цветовую панель в 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,)
Отсюда, Если вам не нравятся тики 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)