是否有标准文本模式工具可以渲染任意数字矩阵数据的热图?

是否有标准文本模式工具可以渲染任意数字矩阵数据的热图?

出于好奇,我创建了一个脚本来可视化 Git 历史记录周/每小时的基本时间戳,以便收集一些统计数据。以下脚本

#!/bin/bash

# Declare the global heatmap hashmap
declare -A HEATMAP

# Composes a key in a form of a <WEEKDAY:1><HOUR:02>
function key {
    local WEEKDAY="$1"
    local HOUR="$2"
    echo -n "$WEEKDAY"
    if [[ "$HOUR" -lt 10 ]]; then
        echo -n '0'
    fi
    echo "$HOUR"
}

# Generate a sequence of weekdays (Mon-Sat,Sun)
function generate_weekdays {
    seq 1 6
    seq 0 0
}

# Generate a sequence of hours in day (00-23)
function generate_hours {
    seq 0 23
}

# Initialize and fill the heatmap with zeroes
for WEEKDAY in $(generate_weekdays); do
    for HOUR in $(generate_hours); do
        HEATMAP[$(key "$WEEKDAY" "$HOUR")]=0
    done
done

# Read the stats into the heatmap
MAX_PEAK=1
while read WEEKDAY_HOUR; do
    HEATMAP["$WEEKDAY_HOUR"]=$((${HEATMAP["$WEEKDAY_HOUR"]} + 1))
    if [[ ${HEATMAP["$WEEKDAY_HOUR"]} -gt "$MAX_PEAK" ]]; then
        MAX_PEAK=${HEATMAP["$WEEKDAY_HOUR"]}
    fi
done < <(git rev-list --date=format:'%w%H' --pretty='format:%ad' $@ | awk 'NR % 2 == 0')

# Render the heatmap
RATIO=0
for WEEKDAY in $(generate_weekdays); do
    for HOUR in $(generate_hours); do
        RATIO=$((100 * ${HEATMAP[$(key "$WEEKDAY" "$HOUR")]} / $MAX_PEAK))
        if [[ "$RATIO" -eq 0 ]]; then echo -ne '\e[38;5;236m'
        elif [[ "$RATIO" -lt 10 ]]; then echo -ne '\e[38;5;107m'
        elif [[ "$RATIO" -lt 20 ]]; then echo -ne '\e[38;5;22m'
        elif [[ "$RATIO" -lt 30 ]]; then echo -ne '\e[38;5;28m'
        elif [[ "$RATIO" -lt 40 ]]; then echo -ne '\e[38;5;70m'
        elif [[ "$RATIO" -lt 50 ]]; then echo -ne '\e[38;5;190m'
        elif [[ "$RATIO" -lt 60 ]]; then echo -ne '\e[38;5;226m'
        elif [[ "$RATIO" -lt 70 ]]; then echo -ne '\e[38;5;220m'
        elif [[ "$RATIO" -lt 80 ]]; then echo -ne '\e[38;5;214m'
        elif [[ "$RATIO" -lt 90 ]]; then echo -ne '\e[38;5;208m'
        elif [[ "$RATIO" -lt 100 ]]; then echo -ne '\e[38;5;160m'
        elif [[ "$RATIO" -eq 100 ]]; then echo -ne '\e[38;5;196m'; fi
        echo -n '*'
        echo -ne '\e[0m'
    done
    echo
done

调用 as./git-heatmap --all会产生如下所示的示例输出(目前不在 Linux 机器上,在 Windows/MinGW 上运行,使用 Fixsys 字体,我更喜欢正方形,\u2BC0,而不是星号,但 Fixedsys 无法渲染我认为更好的正方形):

./git-heatmap --所有示例输出

由于该脚本执行三项工作:

  • 使用 Git 工作日/一天中的小时时间戳输出,
  • 计算统计数据,
  • 并渲染热图

...我想知道是否有类似标准工具的东西可以计算/渲染与上面的热图类似的东西?我的脚本处理 Git 提供的以下示例数据:

100
101
420
517
...

其中第一个数字表示工作日,第二个和第三个数字表示一天中的小时。谢谢。

相关内容