Я использую Matplotlib 1.3.0 и у меня есть следующие:Matplotlib использование стандартной Colormap
import matplotlib.pyplot as plt
cmap = plt.cm.jet
plt.contourf([[.12, .2], [.8, 2]], levels=[0, .1, .3, .5, 1, 3], cmap=cmap, vmin=0, vmax=3)
plt.colorbar()
, который производит:
бит, что я не понимаю, где все остальные цвета пошли? Как я понимаю, указав vmin=0
, vmax=3
то цвет бар должен использовать весь спектр cmap
, как на этой картинке:
, который производится без предоставления аргументов vmin
, vmax
и levels
. Итак ... что мне здесь не хватает?
РЕДАКТИРОВАТЬ 1
В ответ на tom10 & tcaswell. Я бы ожидал, что это будет так, как вы говорите, но ... к сожалению, это не так. Посмотрите на это:
plt.contourf([[.12, .2], [.8, 3.2]], levels=[0, .1, .3, .5, 1, 3], cmap=cmap, vmin=0, vmax=3)
plt.colorbar()
с:
Может прояснить этот немного: у меня есть данные и важные особенности этого являются около 0,1, но есть некоторые вокруг 3 скажем. Поэтому я даю ему levels=[0, 0.005, 0.075, 0.1, 0.125, 0.15, 0.2, 1, 2.5, 2.75, 3, 3.25]
и vmin=0, vmax=3.25
. Теперь я ожидаю увидеть весь диапазон цветов, но вместо этого все важные данные-точки от 0.005 до 0.125 окажутся в синей области (используя стандартную цветовую карту plt.cm.jet
). То, что я говорю, я думаю, это ... если я дам levels=[0, 1, 2, 3], vmin=0, vmax=3
для некоторых данных, которые идут от 0 до 3, я ожидаю увидеть все цвета в данной цветовой карте, но если я дам levels=[0, 0.9, 0.1, 0.11, 1, 3], vmi=0, vmax=3
, я бы ожидал того же, чтобы увидеть все цвета в данной цветовой карте, за исключением отображения на правильные интервалы, вместо этого я вижу кучу блюза, окрашивающего область 0-0.11, а некоторые зеленые/желтые окраски в другую часть региона. Надеюсь, что это ... немного ясно.
EDIT 2
То же самое происходит, даже если я не даю norm
или vmin, vmax
.
EDIT 3
Ссылаясь на комментарий tcaswell, в себя так, как это ... для меня по крайней мере, нелогичным. Я ожидал, что цвет будет несовместим с точками данных. Я ожидал бы, что весь диапазон цветов из цветовой карты будет использоваться все время (кроме случаев, когда vmin, vmax
больше/меньше, чем levels
мин, максимальные значения). Другими словами, глядя на этот код, который я сделал некоторое время назад (Python 3):
import matplotlib.colors as mc
def addNorm(cmapData):
cmapData['norm'] = mc.BoundaryNorm(cmapData['bounds'], cmapData['cmap'].N)
return True
def discretize(cmap, bounds):
resCmap = {}
resCmap['cmap'] = mc.ListedColormap(\
[cmap(i/len(bounds[1:])) for i in range(len(bounds[1:]))]
)
resCmap['bounds'] = bounds
addNorm(resCmap)
return resCmap
затем использовать его как:
levels = [0, .1, .3, .5, 1, 3]
cmapData = discretize(plt.cm.jet, bounds=levels)
plt.contourf([[.12, .2], [.8, 3.2]], levels=levels, cmap=cmapData['cmap'], norm=cmapData['norm'])
plt.colorbar()
, который дает сюжет, где вы можете различать функции (0,1 -0,5), т.е.они больше не в синей области с помощью описанного выше метода с plt.cm.jet
:
Я имею в виду, я знаю, что я решил это, и некоторое время назад тоже ... но мой вопрос, я думаю, это .. . Как получилось, что по умолчанию в matplotlib это не так? Я бы ожидал, что так будет ... или, может быть, это просто конфигурация/аргумент/что-то, чтобы включить это по умолчанию, что мне не хватает?
Ваше обновление ведет себя _exactly_, как я ожидал. Желтый еще 2, ваша верхняя строка (которую вы не рисуете) красная, а над 3 контуром - белая, потому что она находится за пределами ваших уровней. – tacaswell
ОК, я думаю, я понял, как используются эти стандартные шаблоны (и меня это не беспокоит), но ... тогда есть способ заставить цвета вести себя как _I ожидать? то есть. используя ** colormap ** с цветами от ** c0 ** до ** c8 **, допустим, для простоты, но я все еще имею в виду цветовые коды _default_): когда я устанавливаю 'levels = [0, 0.09, 0.1 , 0.11, 3]. Я ожидаю, что он будет использовать ** [c0 (для 0-0,09), c2 (0,09-0,1), c4 (0,09-0,1), c6 (0,1-0,11), c8 (0,11-0,3)] ** вместо использования ** [c0 (0-0,09), c1 (0,09-0,1), c2 (0,1-0,11), c6 (0,11-3)] **. Надеюсь, это имеет смысл ... – razvanc
отлично, но это не то, что вы сделали. Цветовая карта ничего не знает о ваших уровнях, все, что она знает, - это то, как преобразовать скаляр -> цвет линейно между 'vmin' и' vmax'. Посмотрите на перечисленные цветовые карты. – tacaswell