Graph 为热图创建颜色的算法是什么?

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到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
必须对每个颜色分量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