d3

您所在的位置:网站首页 rgb色阶表 d3

d3

2024-02-21 08:15| 来源: 网络整理| 查看: 265

颜色

创建图表最困难的部分之一是选择颜色。 错误的颜色会使图表没有吸引力、无效,最糟糕的是,难以阅读。 本节将为您提供选择颜色的良好框架、有关人类感知的重要事实以及简单的提示。

颜色比例尺

在选择颜色比例时,您首先要确定其用途。回到我们对数据类型的了解,有三个基本的用例:

表示一个类别 表示一个连续的度量值 表示一个发散的度量值 表示类别

我们讨论的前两种数据类型(二进制和标定)最好用分类配色方案表示。 由于我们的度量值没有自然的顺序,所以我们不想使用具有自然顺序的配色方案(比如白色到黑色)。 d3在其d3-scale-chromatic库中有内置的配色方案。

这些分类配色方案经过精心设计,可以在颜色之间形成足够的对比度。 这些方案中的每一个都是一个颜色数组——例如,要使用此列表中的第一个比例,我们将在 d3.schemeCategory10 中的索引处访问每种颜色。

对于分类的配色方案,这对每种颜色都有一个不同的描述性名称是很有帮助的。例如,可能有两种颜色可以被描述为“蓝色”,这可能会令人困惑。

表示连续度量

对于连续的指标,我们将需要一种方法来在颜色值之间进行插值。例如,我们可以用从白色到深蓝色的颜色范围来表示湿度值。 d3-scale-chromium的内置连续比例尺在在顺序部分如下。

image.png 这些是颜色比例,而不是配色方案——d3.interpolateBlues()是一个函数,而不是一个颜色数组。为了得到一个颜色,我们可以给d3.interpolateBlues()一个在0和1之间的十进制-0将返回最左边的颜色(浅灰色),1将给我们右边的深蓝色。用熟悉的术语来说,d3.interpolateBlues()是一个具有[0,1]域和[浅灰色,深蓝色]的范围。 这些单色调比例非常适合基本图表和具有多种颜色比例的图表。但是,有时颜色值之间的步长太小,很难区分值。 在这种情况下,d3-scale-chrom 有许多连续的色阶,它们在另一个色调中循环,增加了值之间的差异。

我们可以看到通过单色调比例(左)与多色调比例(右)区分 50% 和 60% 的颜色之间的差异是多么容易

image.png

表示发散度量

我们的连续色阶在接近色阶末端时在视觉上更加清晰。 这非常适合突出显示高端值(例如,最高湿度值将是最明显的)。 但是,有时我们希望同时突出显示最低和最高指标值。 例如,如果我们正在查看温度,我们可能希望将最冷的日子突出显示为亮蓝色,将最热的日子突出显示为鲜红色。 发散的比例尺以非常饱和/深色的颜色开始和结束,并贯穿浅色的中间位置。

image.png 我们可以看到我们有单色调(每边)和多色调发散尺度。 同样,在更多色调之间循环是有帮助的,这样用户就可以发现指标之间的较小差异,但是当我们已经在两种色调之间循环时,它可能会让人不知所措。 在感受色阶时,请尝试一些不同的选项,以了解在您的特定场景中可以使用的方法。 这不是一个一刀切的决定。

自定义颜色比例尺

有时内置的色阶不会切割出你想要的颜色。 也许您有想要使用的特定颜色,或者您希望图表具有特定的色调。 不用担心! 我们可以使用 d3-interpolate 轻松制作自己的比例尺。 假设我们想用一种颜色来表示温度值,范围从“青色”到“红色”。我们可以用几种方法来插值这两种颜色,包括d3.interpolateRgb()和d3.interpolateHsl()。 让我们制作我们自己的比例,从“青色”到“番茄”——我们需要做的就是将我们的开始和结束颜色作为单独的参数传递给 d3.interpolateHcl()。

我们将在下一节讨论不同颜色空间(rgb、hsl、hcl)之间的区别。

d3.interpolateRgb("cyan","tomato")

这将给我们一个这个比例尺:

image.png 我们的代码已经开始使用一些不同的自定义比例尺。

image.png 我们还有一个实用函数 addCustomScale(),它接受两个参数:

缩放的名称(它需要是一个没有空格的字符串,因为我们使用它来创建和引用一个id) 颜色比例(在传递0和1之间的值时返回颜色的函数) 我们已经创建了一些自定义缩放——检查前三个,它们具有相同的范围,但使用不同的颜色空间进行插值。 我们还可以创建新的离散配色方案。 最后两个自定义比例使用第 33 行定义的称为 interpolateWithSteps() 的函数。 interpolateWithSteps(n) 返回一个新的 n 元素数组,在 0 和 1 之间进行插值。例如, interpolateWithSteps(3) 返回 [0, 0.5, 1] . 我们可以使用这个函数制作一个新的配色方案,通过通过一个颜色比例,并返回等距的范围。例如: interpolateWithSteps(6).map( d3.interpolateHcl("cyan", "tomato") )

将创建以下配色方案。

image.png 我们可以通过传递一个唯一的id和我们的比例来addCustomScale()来查看配色方案。

addCustomScale('interpolate-hcl-steps', interpolateWithSteps(6).map(d3.interpolateHcl('cyan', 'tomato')))

如果我们想创建具有多种颜色的离散配色方案,我们可以使用 d3-scale-chrom 的循环颜色刻度尺。

image.png 我们可以使用我们的interpolateWithSteps()函数来将这个连续的颜色刻度尺分割成一个配色方案。

interpolateWithSteps(10).map( d3.interpolateRainbow )

image.png 自己联系下,制作一些颜色刻度尺来熟练掌握这些函数:

image.png

自定义颜色

颜色可以用不同的格式表示,每种格式都具有不同的长处。但是创建我们自己的颜色需要小心,我们使用的颜色空间会影响我们的图表的解释程度。 三种颜色空间:

rgb hsl hcl 虽然通常来说大家最熟悉的是rgb,但是当时我们以编程方式创建颜色比例时,我们有很好的理由使用hcl。继续读下去,找出原因。 在我们的图表代码中,我们使用了很多映射到特定的纯色的关键字。例如,我们把柱状图柱做成了玉米花蓝色。颜色关键词很好,因为它们很容易记住,并反映了我们在自然语言中引用颜色的方式。 currentColor 大多数颜色关键字是我们用英语描述颜色的方式,但有一个方便的特殊情况:currentColor。 currentColor 会将 CSS 属性设置为当前颜色属性。 这对于从图表组件外部控制单色图表非常有用。 例如,我们可以制作一个颜色填充为 currentColor 的折线图组件。 这样,我们可以轻松地创建不同颜色的线条,只需在 DOM 中将颜色设置得更高。 transparent 另一个有用的颜色关键字是透明度。 这在创建捕获鼠标事件的不可见 SVG 元素时非常有用,例如我们在第 5 章中用于捕获鼠标移动的监听矩形。 在创建数据可视化时,我们经常需要操纵颜色。 在这种情况下, 我们不能使用颜色关键字,因为没有办法使cornflowerblue深 10%。 为了操纵我们的颜色,我们需要了解颜色空间。 rgb

你在从事开发时最有可能遇到的颜色空间是rgb。Rgb颜色由三个值组成:

r: 红色

g: 绿色

b: 蓝色 对于这些值中的每一个,更高的数字使用更深的指定颜色。 把这些值组合在一起以创建一种颜色。 这就是 LCD 屏幕的基本工作原理:每个像素由红色、绿色、和蓝光组成。 这些值以加法方式组合,从黑色开始并朝着具有更高值的白色移动。 这可能与直觉相反任何在纸上使用颜料的人,其中更多的颜料 = 颜色更深。 例如, rgb(0,0,0) 代表黑色,rgb(255,255,255) 代表白色。 我们将讨论的所有颜色空间还有另一个可选的值: a: alpha 透明度 alpha值设置颜色的不透明度—alpha值为0的颜色将为透明。如果没有指定alpha值,则颜色将是完全不透明。 rgb可以用两种格式表示。第一个是函数表示法,以rgb开始,并在括号内按顺序列出每个颜色值。每个值都将在从0到255的范围内。如果我们想指定一个alpha值,我们将将该前缀切换为rgba。 例如,我们将把一种青色表示为绿色和蓝色的组合\

image.png rgb颜色也可以用十六进制表示表示,它以#开头,用从00到FF范围内的两个字符列出每个值。

image.png rgb可能是一个不直观的颜色空间——如果我有一个蓝色,并且想要一个相同亮度的橙色,那么所有的值都必须改变。

image.png

接下来,让我们来看看一个更接近我们的心理颜色模型的颜色空间。

hsl

在hsl颜色空间中,这些值并不代表特定的颜色,而是代表颜色属性:

h: hue.色调表示一个圆形色轮的角度,从红色(0度)开始,然后通过橙色、黄色、....,回到红色(360度)。 s:饱和度。饱和度值从灰色开始(0%),然后上升到完全饱和的颜色(100%)。 l:亮度。亮度值从白色(0%)开始,然后上升到黑色(100%)。 (a: 阿尔法值。同样,alpha通道是可选的,默认为完全不透明度(100%)) 在hsl中,我们的青色将部分围绕着色轮,完全饱和,和中等亮度。 hsl更接近于我们关于颜色之间关系的心理模型——要从蓝色切换到类似的暗橙色和饱和橙色,我们只需要更新色调值。

image.png

hcl

hcl 颜色空间与 hsl 相似,具有相同的值(c 表示色度,这是色彩的另一种度量方式)。\

image.png

这些值不是在空间上均匀的,而是在感知上是均匀的,因此亮度为 50% 的红色和蓝色看起来具有相同的亮度。 让我们看一下下图 hsl(顶部)和 hcl(底部) 在 100% 饱和度和 50% 亮度下的色调光谱。

image.png 我们可以看到 hsl 色调中的色带看起来比其他色调更亮(即使它们在数学是相等的)。 那些色带在 hcl 光谱中不可见。 如果我们创建一个 hsl 颜色空间的 3d 圆柱体,我们就会有一个完美的圆柱体。 但是当我们以这种方式可视化 hcl 色彩空间时,我们可以看到它并不是一个完美的圆筒。 这是因为人类无法检测到所有颜色的饱和度变化。

image.png

image.png 这使得 hcl 成为创建色标的理想选择——如果我们使用颜色来表示不同类别的降雨量,这些颜色应该具有相同的可见度。 这将有助于防止一种颜色支配和扭曲我们对数据的读取。

深入阅读

d3-color

虽然浏览器会识别 rgb 和 hsl 格式的颜色,但没有太多用于操作颜色的原生功能。 d3-color 模块具有用于识别 hcl 格式中的颜色、在格式之间转换以及沿颜色空间维度操作颜色的方法。 我们不会讨论d3-color的细节,但是了解库也是有必要的,如果你发现自己需要手动操作颜色,请查看github.com/d3/d3-color上的文档。

颜色提示

在选择颜色刻度尺时,请牢记以下几点提示。

对比度

image.png 确保您的颜色在所有情况下都与周围环境有足够的对比度。如果您使用 Chrome,有一个很棒的工具可以在您的开发工具中检查您的颜色是否有足够的对比度。 在附录中了解如何使用它。

色盲模式

image.png 不要假设你的用户可以尽可能清楚地看到你的图表,中国科学院遗传研究所的调查说,我国男性色盲占5.4%,女性约占0.73%。为了确保大多数人都能从你的颜色尺度中编码信息,远离用户必须区分红色和绿色的比例。 这是上图对红绿色盲患者的模拟。

image.png 如果我们在第 6 章创建的地图上使用左侧的红色/绿色作为色标,就不可能看到哪些国家有负增长,哪些国家有正增长。

在一些站点中,您可以模拟不同类型的色盲来测试数据可视化,比如color-blindness.com。

Comparing colors

image.png 颜色区域越小比较越困难。 使用颜色作为指标时,确保颜色元素足够大。

语义化

image.png 尽可能地选择语义上有意义的颜色。例如,蓝色表示低温,红色表示高温。

灰色

灰色可能是最重要的颜色。当您想要突出显示图表的部分时,保持其他元素的灰色有助于查看者关注该元素。

合并起来

通过这一章完成伟大的工作。基础知识学习起来可能很乏味,但了解基本知识将为您制作自己的数据可视化打下良好的基础。 以下就是我们这一章的汇总图

image.png



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3