値が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ドキュメント 。
[0、1]値からCSS hslカラーコードを生成するJavaScriptコードスニペットです
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コンポーネントの線形補間は、実際には非常にうまく機能します。また、Brunoが共有したリンクには、HSLで補間を行うことが記載されています。
また、より適切に選択された中間体を使用して、3つの基本色を散在させることもできます。 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の線形補間を行うだけです。 2つの参照値の間(たとえば、0から0.5の間のt)、補間された色Cは
C = (1 - t) * c0 + t * c1
この式を各カラーコンポーネントRGBに適用する必要があります。色線形補間に関する他のヒント: 色シーケンスを補間する方法?
----編集-----質問の誤解に気付いたため、回答のヘッダーを削除しました(コメントを参照)。念のため、一貫した読み取りと情報のためにコピーを残します。
最初の可能性は、0〜255のピクセル値で256X1pixelの画像を作成し、ImageMagickで目的のヒートマップを適用するソフトウェアでリファレンスヒートマップを作成することです。その後、RGBを読み取ってマップを作成できます(値:RGB) 。
ここにSwift 4実装 このブログ投稿 に基づいて任意の量の色を残します!完璧な説明があります!
import Foundation
import UIKit
struct ColorPoint {
let color: UIColor
let value: CGFloat
}
class HeatMapColor {
var colorPoints: [ColorPoint]
init(colorPoints: [ColorPoint]) {
self.colorPoints = colorPoints
}
func colorAt(value: CGFloat) -> UIColor {
if(colorPoints.isEmpty) { return UIColor.black }
let colorsPointsToUse = colorPoints.sorted { (colorPointA, colorPointB) -> Bool in
return colorPointA.value <= colorPointB.value
}
for (index, colorPoint) in colorsPointsToUse.enumerated() where value < colorPoint.value {
let previousColorPoint = colorsPointsToUse[max(0, index - 1)]
let valueDiff = previousColorPoint.value - colorPoint.value
let fraction = valueDiff == 0 ? 0 : (value - colorPoint.value) / valueDiff
guard
let prevComp = previousColorPoint.color.cgColor.components,
let currComp = colorPoint.color.cgColor.components else { continue }
let red = (prevComp[0] - currComp[0]) * fraction + currComp[0]
let green = (prevComp[1] - currComp[1]) * fraction + currComp[1]
let blue = (prevComp[2] - currComp[2]) * fraction + currComp[2]
return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
return colorsPointsToUse.last!.color
}
}
python(pyqtで、一般化するのは簡単です)のシンプルな5色のヒートマップです。
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