来自数据点的热图
Heat map from data points
我有一个给定特定位置的温度数组。
EG:
20 21 22 23 20
20 22 21 23 20
20 21 20 20 20
20 21 23 23 23
21 21 22 23 22
右上角的数据点代表右上角热图中的温度,而左下角 - 代表我要生成的热图的左下角温度。
那么根据这些数据点,我将如何生成一个热图,其中温度越高越红,温度越低越蓝。
我是否应该先将温度转换为 RGB,然后以某种方式绘制 RGB?我该怎么做?
编辑:
数组或 [0,0] 的右上角(在本例中为 20)表示 space 中 [0,0] 处的温度。我想要生成的 2d 热图表示温度摄像机前面的图像。数据点是某些位置的温度。该帖子不是很有帮助,因为它是基于频率而不是将温度转换为颜色并根据位置绘制它。
您可以使用 Python 的内置 tkinter
图形模块来执行如下操作。 pseudocolor()
函数将给定范围内的值映射到沿任意颜色值调色板中的颜色插值的颜色。辅助 colorize()
函数用于将从它返回的颜色值(由 0 到 1 范围内的三个浮点值组成)转换为 tkinter
.[=17 所需的单个十六进制字符串形式=]
由于颜色的选择是由颜色值列表控制的,因此调整输出的外观相当容易。示例热图相对较小,其中的值范围也相对较小,因此生成的图像看起来有点 "chunky" — 但该方法可以很好地缩放,并且更有吸引力的结果可能来自更大、更多样化的数据集。
try:
from Tkinter import *
except ModuleNotFoundError:
from tkinter import * # Python 3
heat_map = [[20, 21, 22, 23, 20],
[20, 22, 21, 23, 20],
[20, 21, 20, 20, 20],
[20, 21, 23, 23, 23],
[21, 21, 22, 23, 22]]
heat_min = min(min(row) for row in heat_map)
heat_max = max(max(row) for row in heat_map)
# Heatmap rgb colors in mapping order (ascending).
palette = (0, 0, 1), (0, .5, 0), (0, 1, 0), (1, .5, 0), (1, 0, 0)
def pseudocolor(value, minval, maxval, palette):
""" Maps given value to a linearly interpolated palette color. """
max_index = len(palette)-1
# Convert value in range minval...maxval to the range 0..max_index.
v = (float(value-minval) / (maxval-minval)) * max_index
i = int(v); f = v-i # Split into integer and fractional portions.
c0r, c0g, c0b = palette[i]
c1r, c1g, c1b = palette[min(i+1, max_index)]
dr, dg, db = c1r-c0r, c1g-c0g, c1b-c0b
return c0r+(f*dr), c0g+(f*dg), c0b+(f*db) # Linear interpolation.
def colorize(value, minval, maxval, palette):
""" Convert value to heatmap color and convert it to tkinter color. """
color = (int(c*255) for c in pseudocolor(value, minval, maxval, palette))
return '#{:02x}{:02x}{:02x}'.format(*color) # Convert to hex string.
root = Tk()
root.title('Heatmap')
# Create and fill canvas with rectangular cells.
width, height = 400, 400 # Canvas size.
rows, cols = len(heat_map), len(heat_map[0])
rect_width, rect_height = width // rows, height // cols
border = 1 # Pixel width of border around each.
canvas = Canvas(root, width=width, height=height)
canvas.pack()
for y, row in enumerate(heat_map):
for x, temp in enumerate(row):
x0, y0 = x * rect_width, y * rect_height
x1, y1 = x0 + rect_width-border, y0 + rect_height-border
color = colorize(temp, heat_min, heat_max, palette)
canvas.create_rectangle(x0, y0, x1, y1, fill=color, width=0)
root.mainloop()
显示:
我有一个给定特定位置的温度数组。
EG:
20 21 22 23 20
20 22 21 23 20
20 21 20 20 20
20 21 23 23 23
21 21 22 23 22
右上角的数据点代表右上角热图中的温度,而左下角 - 代表我要生成的热图的左下角温度。
那么根据这些数据点,我将如何生成一个热图,其中温度越高越红,温度越低越蓝。
我是否应该先将温度转换为 RGB,然后以某种方式绘制 RGB?我该怎么做?
编辑: 数组或 [0,0] 的右上角(在本例中为 20)表示 space 中 [0,0] 处的温度。我想要生成的 2d 热图表示温度摄像机前面的图像。数据点是某些位置的温度。该帖子不是很有帮助,因为它是基于频率而不是将温度转换为颜色并根据位置绘制它。
您可以使用 Python 的内置 tkinter
图形模块来执行如下操作。 pseudocolor()
函数将给定范围内的值映射到沿任意颜色值调色板中的颜色插值的颜色。辅助 colorize()
函数用于将从它返回的颜色值(由 0 到 1 范围内的三个浮点值组成)转换为 tkinter
.[=17 所需的单个十六进制字符串形式=]
由于颜色的选择是由颜色值列表控制的,因此调整输出的外观相当容易。示例热图相对较小,其中的值范围也相对较小,因此生成的图像看起来有点 "chunky" — 但该方法可以很好地缩放,并且更有吸引力的结果可能来自更大、更多样化的数据集。
try:
from Tkinter import *
except ModuleNotFoundError:
from tkinter import * # Python 3
heat_map = [[20, 21, 22, 23, 20],
[20, 22, 21, 23, 20],
[20, 21, 20, 20, 20],
[20, 21, 23, 23, 23],
[21, 21, 22, 23, 22]]
heat_min = min(min(row) for row in heat_map)
heat_max = max(max(row) for row in heat_map)
# Heatmap rgb colors in mapping order (ascending).
palette = (0, 0, 1), (0, .5, 0), (0, 1, 0), (1, .5, 0), (1, 0, 0)
def pseudocolor(value, minval, maxval, palette):
""" Maps given value to a linearly interpolated palette color. """
max_index = len(palette)-1
# Convert value in range minval...maxval to the range 0..max_index.
v = (float(value-minval) / (maxval-minval)) * max_index
i = int(v); f = v-i # Split into integer and fractional portions.
c0r, c0g, c0b = palette[i]
c1r, c1g, c1b = palette[min(i+1, max_index)]
dr, dg, db = c1r-c0r, c1g-c0g, c1b-c0b
return c0r+(f*dr), c0g+(f*dg), c0b+(f*db) # Linear interpolation.
def colorize(value, minval, maxval, palette):
""" Convert value to heatmap color and convert it to tkinter color. """
color = (int(c*255) for c in pseudocolor(value, minval, maxval, palette))
return '#{:02x}{:02x}{:02x}'.format(*color) # Convert to hex string.
root = Tk()
root.title('Heatmap')
# Create and fill canvas with rectangular cells.
width, height = 400, 400 # Canvas size.
rows, cols = len(heat_map), len(heat_map[0])
rect_width, rect_height = width // rows, height // cols
border = 1 # Pixel width of border around each.
canvas = Canvas(root, width=width, height=height)
canvas.pack()
for y, row in enumerate(heat_map):
for x, temp in enumerate(row):
x0, y0 = x * rect_width, y * rect_height
x1, y1 = x0 + rect_width-border, y0 + rect_height-border
color = colorize(temp, heat_min, heat_max, palette)
canvas.create_rectangle(x0, y0, x1, y1, fill=color, width=0)
root.mainloop()
显示: