Предполагая, что значения нормированы от 0 до 1, каков алгоритм, чтобы получить цвет для создания такой тепловой карты?
1 красный,.5 зеленый, 0 - синий.
Работа в RMagick/ImageMagick.
Предполагая, что значения нормированы от 0 до 1, каков алгоритм, чтобы получить цвет для создания такой тепловой карты?
1 красный,.5 зеленый, 0 - синий.
Работа в RMagick/ImageMagick.
Я нашел это удивительно легко связанным с HSL.
В Ruby:
def heatmap_color_for value # [0,1]
h = (1 - value) * 100
s = 100
l = value * 50
"hsl(#{h.round(2)}%,#{s.round(2)}%,#{l.round(2)}%)"
end
Этот метод возвращает значения HSL в виде строки от 0% до 100%. Его можно использовать с RMagick или ImageMagick.
Ссылка: Документация ImageMagick HSL.
Вот фрагмент кода JavaScript для генерации цветового кода CSS hsl из значения [0, 1]
function heatMapColorforValue(value){
var h = (1.0 - value) * 240
return "hsl(" + h + ", 100%, 50%)";
}
Этот алгоритм основан на 5 цветной тепловой карте,
В этом алгоритме цвета, соответствующие значениям,
0 : blue (hsl(240, 100%, 50%))
0.25 : cyan (hsl(180, 100%, 50%))
0.5 : green (hsl(120, 100%, 50%))
0.75 : yellow (hsl(60, 100%, 50%))
1 : red (hsl(0, 100%, 50%))
Так просто!
Линейная интерполяция компонентов RGB работает на практике довольно хорошо, и ссылка, которую Бруно разделяет, упоминает о вашей интерполяции в HSL, которая может помочь.
Вы также можете пересечь три основных цвета с более красиво выбранными промежуточными продуктами. Посмотрите http://colorbrewer2.org/ для некоторых хороших цветовых прогрессий. Затем выполните следующие шаги:
0 red
0.25 yellow
0.5 green
0.75 cyan
1 blue
Общий подход - интерполировать цвета. Вы решили, что
0: 0 0 255 (or any blue)
0.5: 0 255 0 (or any green)
1: 255 0 0 (or any red)
Вы просто выполняете линейную интерполяцию RGB. Между двумя опорными значениями (например, t между 0 и 0,5) интерполированный цвет C похож на
C = (1 - t) * c0 + t * c1
Вы должны применить эту формулу для каждого цветового компонента RGB. Некоторые другие подсказки о цветовой линейной интерполяции: Как интерполировать последовательность цветов?
---- править ----- Я удалил заголовок своего ответа, так как понял, что неправильно понял вопрос (см. Комментарий). Я оставляю копию для постоянного чтения и информации на всякий случай.
Первая возможность заключается в создании эталонной карты с любым программным обеспечением, которое: создайте изображение 256X1pixel с значениями пикселей от 0 до 255 и примените желаемую карту тепла с помощью ImageMagick: тогда вы можете прочитать RGB назад и построить карту (значение: RGB).
Здесь простая 5-цветная тепловая карта в питоне (в pyqt, но легко обобщается)
def genColorMap(self):
points = [(255,0,0), (255,255,0), (0,255,0), (0,255,255), (0,0,255)]
cm = {}
for i in range(0, 256):
p0 = int(numpy.floor((i/256.0)/len(points)))
p1 = int(numpy.ceil((i/256.0)/len(points)))
rgb = map(lambda x: x[0]*max(0,(i-p0)) + x[1]*max(0,(i-p1)), zip(points[p0], points[p1]))
cm[i] = QtGui.qRgb(rgb[0], rgb[1], rgb[2])
return cm