了解 ggplot2 中的色阶

Lul*_*ulY 28 r ggplot2

有很多方法可以定义ggplot2. 加载后,ggplot2我计算以(或)22开头的函数以及以 开头的相同数字。能否简单说明一下下面这些函数的用途?特别是我对某些功能的差异以及何时使用它们感到困惑。scale_color_*scale_colour_*scale_fill_*

  • 缩放_*_binned()
  • 规模_*_brewer()
  • 缩放_*_连续()
  • 比例_*_日期()
  • 比例_*_日期时间()
  • 尺度_*_离散()
  • 规模_*_distiller()
  • 规模_*_发酵机()
  • 缩放_*_梯度()
  • 缩放_*_gradient2()
  • 缩放_*_gradientn()
  • 比例_*_灰色()
  • 比例_*_色调()
  • 规模_*_身份()
  • 缩放_*_手动()
  • 比例_*_序数()
  • 缩放_*_steps()
  • 缩放_*_steps2()
  • 缩放_*_stepsn()
  • 缩放_*_viridis_b()
  • 缩放_*_viridis_c()
  • 缩放_*_viridis_d()

我尝试过的

我尝试在网上进行一些研究,但读得越多,我就越感到困惑。删除一些随机示例:“连续填充比例的默认比例是scale_fill_continuous(),而默认比例为scale_fill_gradient()。我不明白这两个功能有什么区别。再次强调,这只是一个例子。scale_color_binned()对于和来说也是如此,scale_color_discrete()我无法说出其中的区别。scale_color_date()在这种情况下,scale_color_datetime()destription 会说“scale_*_gradient创建一个两种颜色渐变(低-高),scale_*_gradient2创建一个发散的颜色渐变(低-中-高),scale_*_gradientn创建一个 n 颜色渐变。” 很高兴知道,但这与scale_color_date()和有何关系scale_color_datetime()?在网络上寻找这些功能也没有给我提供非常丰富的信息来源。关于这个主题的阅读也会变得混乱,因为不同的软件包中有大量的调色板,这些调色板是连续的/发散的/定性的,而且可以以不同的方式设置相同的颜色,即通过颜色名称、RGB、数字、十六进制代码或调色板名称。在某种程度上,这与有关功能的问题没有直接关系2*22,但在某些情况下,这是因为提供“错误”的调色板会导致错误(例如 error "Continuous value supplied to discrete scale)。

为什么我问这个

I need to do many plots for my work and I am supposed to provide some function that returns all kind of plots. The plots are supposed to have similiar layout so that they fit well together. One aspect I need to consider here is that the colour scales of the plots go well together. See here for example, where so many different kind of plots have same colour scale. I was hoping I could use some general function which provides a colour palette to any data, regardless of whether the data is continuous or categorical, whether it is a fill or col easthetic. But since this is not how colour scales are defined in ggplot2 I need to understand what all those functions are good for.

che*_*123 47

这是一个很好的问题……我希望能有一个实用的指南。有人可能会问 SO 是否是提出这个问题的好地方,但无论如何,这是我尝试scale_color_*()总结. 在这里,我们将使用;来描述函数的范围。然而,相同的一般规则将适用于函数。scale_fill_*()ggplot2scale_color_*()scale_fill_*()

总体分类

总共有22个功能,但令人高兴的是我们可以根据实际使用场景对它们进行智能分组。可以使用三个关键标准来实际定义如何使用每个功能scale_color_*()

  1. 测绘数据的性质。映射到色彩审美的数据是离散的还是连续的连续数据可以通过实数来解释:时间、温度、长度 - 这些都是连续的,因为即使您的观察结果是12,也可能存在理论值为 的东西1.5离散数据正好相反:您无法通过实数来表达该数据。举例来说,如果您的观察结果是:"Model A""Model B"。没有明显的方式来表达介于两者之间的东西。因此,您只能将它们表示为单一颜色或数字。

  2. 色彩空间。用于在绘图上绘制的调色板。默认情况下,ggplot2使用(我相信)基于均匀间隔的色调值的调色板。库中还内置了其他使用 Brewer 调色板或 Viridis 色彩空间的函数。

  3. 规范水平。一般来说,一旦定义了缩放函数是否连续以及在什么色彩空间中,用户需要或可以指定的控制或规范级别就会有所不同。一个很好的例子是函数:*_continuous()*_gradient()*_gradient2()*_gradientn()

连续刻度

我们可以从连续尺度开始。这些函数都在应用于连续变量的观测值时使用(见上文)。这里的函数可以进一步定义它们是否已装箱或未装箱。“分箱”只是对连续变量的范围进行分组以将其全部分配给特定颜色的一种方式。您会注意到“合并”的效果是将图例键从“颜色条”更改为“步骤”图例。

连续示例(颜色条图例):

library(ggplot2)
cont <- ggplot(mtcars, aes(mpg, disp, color=cyl)) + geom_point(size=4)

cont + scale_color_continuous()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

分箱示例(颜色步骤图例):

cont + scale_color_binned()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以下是连续函数。

功能名称 色彩空间 传奇 它能做什么
缩放颜色连续() 默认 颜色条 基本规模(就好像你什么也没做一样)
比例颜色渐变() 用户自定义 颜色条 定义lowhigh价值观
比例颜色渐变2() 用户自定义 颜色条 定义low midhigh价值观
比例颜色渐变() 用户自定义 颜色条 定义任意数量的增量值
scale_color_binned() 默认 颜色步骤 基本比例,但已分箱
比例颜色步骤() 用户自定义 颜色步骤 定义lowhigh价值观
比例颜色步骤2() 用户自定义 颜色步骤 定义lowmidhighval
比例颜色步数() 用户自定义 颜色步骤 定义任意数量的增量值
scale_color_viridis_c() 维里迪斯 颜色条 viridis 色标。通过更改调色板option=
scale_color_viridis_b() 维里迪斯 颜色步骤 Viridis 色标,已分档。通过更改调色板option=
比例颜色蒸馏器() 布鲁尔 颜色条 布鲁尔色标。通过更改调色板palette=
scale_color_fermenter() 布鲁尔 颜色步骤 布鲁尔色标,已装箱。通过更改调色板palette=

离散尺度

这些离散比例仅当映射的数据是离散的时才适用(见上文)。由于离散尺度的性质和颜色在定义上更加脱节,因此它们往往更多地是手动定义的。我们可以使用相同的示例,并通过映射到定义mtcars来“强制”将离散比例应用于颜色:cylas.factor()

discrete <- ggplot(mtcars, aes(mpg, disp, color=as.factor(cyl))) + geom_point(size=4)
discrete
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

以下是离散尺度函数:

功能名称 它能做什么
比例颜色离散() 基本默认。均匀分布的色调
比例颜色色调() 与 相同scale_color_discrete(),但您可以定义所使用的色调和颜色的范围
比例颜色灰色() 使用灰度。可以定义范围。
比例颜色手册() 必须具体定义所使用的每种颜色。您可以通过提供 的命名向量来应用您的映射values=
比例颜色标识() 一种特殊情况的函数,其中数据由颜色名称组成 - 而不是因子水平名称
比例颜色布鲁尔() Brewer色彩空间的离散版本。通过更改调色板palette=
scale_color_viridis_d() viridis色彩空间的离散版本。可以通过更改调色板option=

Viridis 和 Brewer 量表

最后一点,您将看到上面定义了 Brewer 和 Viridis 调色板选项的函数。其中每一个都包含一些调色板,这些调色板被选择来更好地表示基于某种颜色理论的有序和无序数据。自己对应用于数据可视化的颜色理论进行一些研究是很有用的。这两个函数类都有离散、连续和分箱版本,并且每个函数类都有稍微不同的方法来更改特定调色板。您必须在 Google 上搜索一下每种音阶的一些表示形式才能对它们有所了解,但有用的使用说明包括:

色彩空间 离散版本 连续版 分箱版本
布鲁尔 比例颜色布鲁尔() 比例颜色蒸馏器() scale_color_fermenter()
维里迪斯 scale_color_viridis_d() scale_color_viridis_c() scale_color_viridis_b()

最后一点:scale_color_ordinal()scale_color_viridis_d(),老实说,我并没有真正看到区别,所以也许一个只是另一个的包装?

日期刻度

最后两个深奥的函数是与datedatetime相关的函数。这些函数分别是scale_color_date()和。scale_color_datetime()它们与函数基本相同scale_color_continuous(),但有一些方便的包装器来标记日期。scale_x_date()这与与 的关系相同scale_x_continuous()

ggplot(economics, aes(x=date, y=unemploy, fill=date)) + geom_col() +scale_fill_date()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您会看到图形结果与 相同scale_color_continuous(),但请注意使用 表示日期校正的格式优势scale_color_date()

ggplot(economics, aes(x=date, y=unemploy, fill=date)) + geom_col() +scale_fill_continuous()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这一切都有道理……

鉴于上述所有内容...现在您之前可能见过的以下错误消息变得非常明显:

> discrete + scale_color_continuous()
Error: Discrete value supplied to continuous scale

> cont + scale_color_discrete()
Error: Continuous value supplied to discrete scale
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的答案@chemdork123。它可能会成为一个很好的社区维基,因为我以前没有见过所有这些都放在一个地方,而且它比尺度文档更有帮助。 (3认同)
  • 对于`ggplot2`,有很多函数是“包装”或“方便”函数。它们看起来是重复的,因为它们实际上是“本质上”使用一组特定参数调用另一个函数的函数。`scale_*` 函数中充斥着这种类型的东西,它们使绘图变得更加容易。所以,从开发、选择来说,当你在实践中不断地使用这些的时候,这是相当明智的。 (2认同)
  • 真的:你的回答非常出色。它是迄今为止描述颜色缩放的系统来源! (2认同)
  • chemdork 您介意将一些评论合并到您的答案中吗?我发现有些想法可能值得放在更突出的位置,评论也可以删除得不留痕迹。 (2认同)