Graph 为热图创建颜色的算法是什么?
假设值从0到1标准化,那么获得颜色以创建这样的热图的算法是什么 1是红色,.5是绿色,0是深蓝色 在RMagick/ImageMagick工作Graph 为热图创建颜色的算法是什么?,graph,colors,charts,visualization,heatmap,Graph,Colors,Charts,Visualization,Heatmap,假设值从0到1标准化,那么获得颜色以创建这样的热图的算法是什么 1是红色,.5是绿色,0是深蓝色 在RMagick/ImageMagick工作 通常的方法是插值颜色。 你决定了 0: 0 0 255 (or any blue) 0.5: 0 255 0 (or any green) 1: 255 0 0 (or any red) 您只需对RGB进行线性插值。 在2个参考值之间(例如t介于0和0.5之间),插值颜色C如下 C = (1 - t) * c0 + t * c1 必须对每个颜色分量R
通常的方法是插值颜色。 你决定了
0: 0 0 255 (or any blue)
0.5: 0 255 0 (or any green)
1: 255 0 0 (or any red)
您只需对RGB进行线性插值。
在2个参考值之间(例如t介于0和0.5之间),插值颜色C如下
C = (1 - t) * c0 + t * c1
必须对每个颜色分量RGB应用此公式。
关于颜色线性插值的其他提示:
----编辑-----
我删除了答案的标题,因为我意识到我误解了这个问题(见评论)。
为了以防万一,我留了一份副本,以供一致的阅读和信息
第一种可能性是使用任何软件构建参考热图,该软件将:
创建一个像素值为0到255的图像256x1像素,并使用ImageMagick应用所需的热图:然后您可以读回RGB并构建一个地图(值:RGB)。RGB组件的线性插值在实践中效果非常好,Bruno分享的链接提到用HSL进行插值,这会有所帮助 你也可以在你的三种基本颜色中穿插选择更合适的中间色。查看一些好的颜色进度。然后进一步分解步骤:
0 red
0.25 yellow
0.5 green
0.75 cyan
1 blue
我发现用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
此方法以0%到100%之间的字符串形式返回HSL值。它可以与RMagick或ImageMagick一起使用
参考文献:
在Java中,对于CSS,测试:
private String getHeatmapColorForCSS(double normalizedValue0to1) {
double h = (1 - normalizedValue0to1) * 360;
double s = 100;
double l = 50;
return String.format("hsl(%.2f, %.2f%%, %.2f%%)", h, s, l);
}
请注意CSS和ImageMagick之间的关键区别:第一个值是0-360,没有百分号。下面是一个JavaScript代码片段,用于从[0,1]值生成CSS hsl颜色代码
function heatMapColorforValue(value){
var h = (1.0 - value) * 240
return "hsl(" + h + ", 100%, 50%)";
}
该算法基于
在该算法中,与值对应的颜色是
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%))
太简单了 这是python中的一个简单的5色热图(在pyqt中,但很容易推广)
我在这里留下了一个Swift 4实现的基础上,任何数量的颜色!完美的解释就在那里!希望它能帮助和节省一些时间给别人 <代码>导入基础 导入UIKit 结构色点{ 让颜色:UIColor let值:CGFloat } 类热图颜色{ 变量colorPoints:[ColorPoint] 初始化(色点:[色点]){ self.colorPoints=colorPoints } func colorAt(值:CGFloat)->UIColor{ if(colorPoints.isEmpty){return UIColor.black} 让colorsPointsToUse=colorPoints.sorted{(colorPointA,colorPointB)->Bool-in
return colorPointA.value Checkout this:-没有线索。无论如何,这不是我第一种方法的重点,我的意思是:创建一个值为0-255的文件,然后使用您最喜欢的工具应用热图,并使用创建的热图作为参考。啊,我意识到我误解了您的最后一句话。我记得您说过热图颜色转换是使用Image magick,并且您希望自己在代码中完成。我编辑了我的答案。这个colorbrewer很棒!h不是百分比,而是色轮上0-360度的度数。要为css创建值,请更改为h=(1-值)*360,并去掉“hsl(xx,xx,xx)”中第一个值的百分号不错的答案,但请尝试解释代码,以便OP能够理解它,而不是在不掌握它的情况下使用它!很好的解决方案,此代码将HSL转换为RGB您的答案看起来非常有趣。这一个带有热图/颜色比例示例的代码看起来也很棒:
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