Установка ограничений на цветовую шкалу контурного графика

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

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

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

Ответ 1

Я предлагаю вам включить сюжет в фиге и получить вдохновение от этого образца, используя 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.

это не сложно, чего вы хотите достичь, но подсказка к фигу может помочь.

Этот другой использует ticks, чтобы определить масштаб цветной панели.

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

Ответ 2

Я подумал, что этот вопрос указывает на ошибку, но он превращает это ограничение использования/совместимости. Решение состоит в том, чтобы создать контуры для диапазона цветовой марки, который вы хотите, и использовать 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, но, надеюсь, вы поняли эту идею.

Ответ 3

Возможно, это самый простой способ.

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

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

...

Ответ 4

Я столкнулся с той же проблемой и придумал конкретный (хотя и бессмысленный) пример этой проблемы. Прокомментированная команда 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)

Ответ 5

Вот мое собственное мнение, которое я лично нахожу немного более ясным и унифицированным

density=10
x = np.linspace(-1,1,num=density,endpoint=True)
y = np.linspace(-1,1,num=density,endpoint=True)
x = x.repeat(density)
y = np.hstack((y,)*density)
z = np.e**(-(x**2+y**2))

fig,  ax = plt.subplots()


vmin=0.30
vmax=0.60
plot_val = np.linspace(vmin, vmax, 300, endpoint=True)


cntr = ax.tricontourf(x, y, z, plot_val,
                      vmin=vmin,vmax=vmax,
                      extend='both'
                 )

cbar = fig.colorbar(cntr,ax=ax)
cbar.set_ticks(np.arange(0,0.61,0.1))