如何创建用于生成 hsl 颜色数组的标准化分布?

Posted

技术标签:

【中文标题】如何创建用于生成 hsl 颜色数组的标准化分布?【英文标题】:How can I create a normalized distribution for producing an hsl color array? 【发布时间】:2021-05-01 14:15:06 【问题描述】:

我正在创建一个热图,其中 SVG 中的国家/地区路径使用 HSL 获得全部为红色阴影的填充颜色。

colorC = "hsl(0,100%," + colorL + "%)"

地图通过几种不同的方法工作得很好,用户可以手动选择自己的颜色强度,但我想通过添加一个“自动”功能来改进地图,该功能可以根据数据集的值选择良好的颜色强度.

我一直在玩贝尔分布和各种形式的数据标准化,但这些并没有真正实现目标。这里是关于工作方法的更多信息。

我必须处理两个数据集,一个是所有条目的主数据集,它显示出对英国的强烈倾斜,另一个是我正在尝试映射的目标子集。在我的工作方法中,我遍历目标子集,通过主数据集对每个国家/地区的数据进行归一化,然后将每个值乘以手动选择的 colorIntensity

colorL = (100 - (100 * colorIntensity * countrySubset[i] / countryMasterset[i]))

默认值是colorIntensity = 1,它适用于大型子集,但在较小的子集上大部分内容都被白色化了。子集大小变化很大,由于子集是嵌套的并且可以通过父母和孩子向上或向下移动,自动colorIntensity 值将是一个很好的资产。

所以,这是超出我能力范围的统计问题。什么类型的归一化和/或分布可以帮助我展示一个从不黑色hsl(0,100%,0%) 和从不白色hsl(0,100%,100%),但在深红色hsl(0,100%,25%) 到浅粉色hsl(0,100%,99%) 范围内很好分布的颜色分布?所有零值默认为浅灰色。

例如,colorIntensity = 20 的以下子集看起来很棒(美国数据用于数学计算,但未显示在地图上,因为地图仅显示欧洲):

"Wales": 15, "USA": 11, "Netherlands": 1, "Ireland": 2, "England": 2

虽然colorIntensity = 10 的下一个子集看起来要好得多(这是上面的 ggparent):

"Germany": 34, "Switzerland": 12, "England": 44, "France": 13, "Italy": 10, "Sweden": 1, "Poland": 1, "Wales": 25, "USA": 44, "Canada": 3, "Mexico": 1, "Austria": 1, "Belgium": 1, "Ukraine": 1, "Portugal": 1, "Netherlands": 1, "Ireland": 20, "Denmark": 1, "Czech Republic": 8, "Luxembourg": 1, "Russia": 1, "Northern Ireland": 5, "Scotland": 29, "Turkey": 1, "Spain": 1, "Finland": 4

【问题讨论】:

【参考方案1】:

我不知道我是否找到了最佳解决方案,但我确实找到了我喜欢的解决方案。该解决方案有两个组成部分:选择一个有吸引力的colorIntensity 和处理个别国家的极端情况。

将我首选的手动选择的colorIntensity 值放入 Excel 中,我意识到它们是负相关的,因此我将 colorIntenstiy 设置为负幂函数和最大值:

colorIntensity = 300 * Math.pow(subsetTotal,-0.57)
if(colorIntensity > 25) colorIntensity = 25

然后,为了处理单个国家主导数据子集的情况,并且一个国家有一些数据但不多的情况,我还在循环本身中设置了这些情况的最大值和最小值。

for (var i in countrySubset) 
    var countryNormalized = countrySubset[i] / countryMasterset[i],
        colorNormalized = colorIntensity * countryNormalized
    if(colorNormalized > 0.75) colorNormalized = 0.75
    if(colorNormalized < 0.01) colorNormalized = 0.01
    colorL = (100 - (100 * colorNormalized))

我对最终结果感到满意,并希望这可以帮助其他处理 javascript 和规范化、标准化或缩放数据的人。

【讨论】:

以上是关于如何创建用于生成 hsl 颜色数组的标准化分布?的主要内容,如果未能解决你的问题,请参考以下文章

从 HSL 值创建 C# 颜色

将数组作为 CLI 参数传递给程序的标准表示法是啥?

如何将 RGB 颜色转换为 HSV?

如何创建具有一定梯度分布的 HTML 颜色数组?

如何使用快捷键(只有键盘没有鼠标)更改 css 文件中的颜色类型(rgb、hsl、hex)?代码

如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 还是 hsl 颜色?