Только цветовая шкала с пользовательскими цветами, значениями и градиентом - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в matplotlib и изо всех сил пытаюсь построить colorBar с пользовательскими значениями.

Более конкретно, мне нужно построить только цветную полосу, а не связанную фигуру, и для этого у меня есть список цветовзначения, а также соответствующие значения для каждого из этих цветов;

Я попробовал два разных метода, но не могу получить то, что хочу:

import matplotlib as mpl
from matplotlib import pyplot as plt

colors = [ #1A6AD0, #3D98E3, #79C4E9, #055A05, #99C48C, #AC8C1A  ]
values = [ -1800 , -1200, -1, 0, 600 , 1200 ]

fig = plt.figure( figsize=(2,4) )
ax = fig.add_axes([0, 0.05, 0.25, 0.9])

# First option :
cmap = LinearSegmentedColormap.from_list("mypalette", colors, N=1000)         
norm = mpl.colors.Normalize(vmin=min(values), vmax=max(values))  
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, orientation='vertical') # also tried to add ticks=values here but no ..doesnt work ..  Color palette has a nice gradient but values do not match their colors. not even with spacing = 'uniform' or 'proportional' ...

# Second option :
norm2 = mpl.colors.BoundaryNorm(values, cmap.N)
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm2, spacing='proportional' , orientation='vertical', ticks=values ) # Values correspond to the rights colors, but there is no gradient

Итак, моя проблема в том, что в первом случае мне удается получить хороший градиент цвета, нозначения (которые будут галочками) не отображаются в правильной «цветовой позиции» (например, зеленые грани 600, а должны стоить 100). Вся проблема в том, что мои значения расположены неравномерно.Но я не могу их изменить!

Во втором случае у меня правильное соответствие между цветами и значениями, но теперь цвета являются дискретными (появляются по блокам), что действительно раздражает (и не только для визуальных целей)

Я особенно ожидаю быстрого цветового перехода от синего к зеленому для значений, соответствующих -1 и 0

К сожалению, я не могу показать здесь фотографии, когда я использую безопасный компьютер для программирования, но то, что я получил вПервый и второй метод аналогичны первым двум изображениям на этой странице: https://matplotlib.org/tutorials/colors/colorbar_only.html#sphx-glr-tutorials-colors-colorbar-only-py

Конечно, я хотел бы получить ColorBar с хорошим цветовым градиентом и правильным соответствием между цветами<-> значения

Я нашел и прочитал различные примеры в Интернете, особенно здесь и в документации по matplotlib, но, черт возьми ... невозможно

Я что-то упускаю из виду?

Большое спасибо

[английский не мой родной язык]

1 Ответ

0 голосов
/ 05 марта 2019

Полагаю, вы хотите указать соответствующие позиции цветов при создании карты цветов.Иначе, цвета равномерно распределены в диапазоне от 0 до 1.
При предоставлении позиций вы не можете использовать значения напрямую, но должны отобразить их в единичном интервале.Для этого можно использовать то же norm, что и для создания цветовой панели.

import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

colors = [ "#1A6AD0", "#3D98E3", "#79C4E9", "#055A05", "#99C48C", "#AC8C1A"]
values = [ -1800 , -1200, -1, 0, 600 , 1200 ]

fig = plt.figure( figsize=(2,4) )
ax = fig.add_axes([0, 0.05, 0.25, 0.9])

norm = mpl.colors.Normalize(vmin=min(values), vmax=max(values))  
normed_vals = norm(values)

cmap = LinearSegmentedColormap.from_list("mypalette", list(zip(normed_vals, colors)), N=1000)  
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap, norm=norm, orientation='vertical')

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...