Jaki jest algorytm tworzenia kolorów dla heatmapy?
Zakładając, że wartości są znormalizowane z 0 do 1, Jaki jest algorytm, aby uzyskać kolor, aby utworzyć taką heatmapę?
1 jest czerwony, .5 to zielony, 0 to ciemnoniebieski.
Praca w RMagick / ImageMagick.
6 answers
Oto fragment kodu JavaScript do generowania kodu kolorów CSS HSL z [0, 1] wartości
function heatMapColorforValue(value){
var h = (1.0 - value) * 240
return "hsl(" + h + ", 100%, 50%)";
}
Algorytm ten opiera się na 5 color heatmap ,
W tym algorytmie kolory odpowiadające wartościom to
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%))
To takie proste!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 01:29:54
Okazało się to zaskakująco łatwe do zrobienia z HSL.
W 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
Ta metoda zwraca wartości HSL jako ciąg znaków od 0% do 100%. Może być używany z RMagick lub ImageMagick.
Reference: ImageMagick HSL documentation.
W Javie, dla CSS, testowane:
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);
}
Zwróć uwagę na kluczową różnicę między CSS i ImageMagick: pierwsza wartość to 0-360 i bez znaku procentowego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-04 04:25:34
Interpolacja liniowa komponentów RGB działa całkiem dobrze w praktyce, a link, który udostępnił Bruno, wspomina o wykonaniu interpolacji w HSL, co może pomóc.
Możesz również przeplatać swoje trzy podstawowe kolory z ładnie dobranymi półproduktami. Sprawdź http://colorbrewer2.org / dla dobrych progresji kolorów. Następnie przerwij swoje kroki dalej:
0 red
0.25 yellow
0.5 green
0.75 cyan
1 blue
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-16 07:58:38
Ogólnym podejściem jest interpolacja kolorów. Zdecydowałeś, że
0: 0 0 255 (or any blue)
0.5: 0 255 0 (or any green)
1: 255 0 0 (or any red)
Po prostu wykonujesz liniową interpolację RGB.
Między 2 wartościami odniesienia (np. t pomiędzy 0 a 0,5), interpolowany Kolor C jest podobny
C = (1 - t) * c0 + t * c1
Musisz zastosować tę formułę na każdym składniku kolorów RGB. Inne wskazówki dotyczące interpolacji liniowej kolorów: jak interpolować sekwencję kolorów?
---- Edycja ----- Usunąłem nagłówek mojej odpowiedzi, ponieważ zrozumiałem, że źle zrozumiałem pytanie (patrz komentarz). Zostawiam kopię do konsekwentnego czytania i informacji, na wszelki wypadek.
Pierwszą możliwością jest zbudowanie referencyjnej heatmapy z dowolnym oprogramowaniem, które: Utwórz obraz 256X1pixel z wartościami pikseli od 0 do 255 i zastosuj żądaną mapę cieplną za pomocą ImageMagick: następnie możesz odczytać RGB z powrotem i zbudować mapę (wartość:RGB).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30
Zostawiam tutaj implementację Swift 4 opartą na ten wpis na blogu dla dowolnej ilości kolorów! Doskonałe wyjaśnienie jest tam! Mam nadzieję, że to pomaga i oszczędza trochę czasu dla kogoś!
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
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-30 19:37:21
Oto prosta 5 kolorowa heatmap w Pythonie (w pyqt, ale łatwa do uogólnienia)
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-09 18:54:32