【问题标题】:mapping (ordered) factors to colors in ggplot将(有序)因子映射到ggplot中的颜色
【发布时间】:2018-11-30 15:10:36
【问题描述】:

考虑这个例子

data_frame(mylabel = c('month 18',
                       'month 19',
                       'month 20',
                       'month 21',
                       'month 22'),
           value = c(5,10,-2,2,0),
           time = c(1,2,3,4,5)) %>% 
  ggplot(aes( x= time, y = value, color = mylabel)) +
  geom_point(size = 7)

在这里您可以看到变量 mylabel 具有自然顺序:第 18 个月在第 19 个月之前,依此类推。

但是,ggplot 选择的颜色不会保留这种自然顺序。在我的真实数据集中,我有大约 50 个不同的月份,我想使用一个色标来使这种增加更加直观(比如从冷到热)。

我该怎么做? 谢谢!

【问题讨论】:

  • 你能提供预期的输出吗?
  • 任何保留顺序的东西。说一些在第 18 个月和第 19 个月更冷,在第 21 个月和第 22 个月更热的色标。你明白我的意思吗?
  • 解析mylabel中的数字,然后将其用作连续变量并根据需要修复图例?还是您特别想要离散颜色而不是渐变?
  • 在您的示例中,保留了顺序,但因子将按字典顺序排序,因此您必须解决该问题,例如,如果您有 factor(paste('month', 1:12)),则顺序将为 1、10、11、12、2等。但就您的示例而言,您所要做的就是添加一个 scale_color_manual() 与您想要的任何颜色。见ggplot2.tidyverse.org/reference/scale_manual.html
  • @qdread 谢谢你准确地解决了这个问题。如何避免手动重新排序因子?

标签: r ggplot2 dplyr


【解决方案1】:

您可以使用 viridis 色标或其他颜色更好的色标来指示顺序。

对于相似的色标,包含多个选项(选项 =“A”到“D”)。通过direction = -1更改顺序

我添加了一个步骤来更好地订购,以防月份列出不正确。它有效,但我确信有一种更简单的方法。从名称中提取月份#(必须从char 转换为numeric),然后将其分解为使用正确顺序的因素。

library(tidyverse)
data_frame(mylabel = paste("month", 1:10),
             value = rnorm(length(mylabel)),
             time = seq_along(mylabel)) %>% 
    mutate(month_number = factor(as.numeric(gsub("month ([0-9]+)", "\\1", mylabel)))) %>% 
  ggplot(aes( x= time, y = value, color = month_number)) +
  geom_point(size = 7) +
  scale_color_viridis_d(option = "B", direction = -1)

reprex package (v0.2.1) 于 2018 年 11 月 30 日创建

【讨论】:

  • 感谢马特。但是我该如何解决上面提到的问题,即 factor(paste('month', 1:12)) 顺序将是 1, 10, 11, 12, 2
  • 我明白了,但我不确定您的列表中哪些月份是热/冷的。我会尝试制作一些可以改编的东西。
  • 只要前几个月的颜色与后一个月不同,这并不重要。它是一个视觉的东西,真的。谢谢!
  • 我认为 Matt L. 不明白混合排序是一个问题,因为您的示例仅包含 18-22,无论是按递增数字还是按字典顺序排序,它都保持相同的顺序
  • 我终于明白了——这是一个单独的问题,但我已经更新以解决我认为的问题。
【解决方案2】:

forcats 中的as_factor 函数会在水平发生时对水平进行排序,而不是先放置所有以“1”开头的事物,然后放置所有以“2”开头的事物,等等。这避免了从 1 到几个月的问题12.

我编造不同的数据只是为了得到完整的月份标签。

library(dplyr)
library(ggplot2)

set.seed(1234)
df <- data_frame(mylabel = paste("month", 1:12),
                 value = rnorm(12),
                 time = 1:12)

df_fact <- df %>%
  mutate(mylabel = forcats::as_factor(mylabel))

levels(df_fact$mylabel)
#>  [1] "month 1"  "month 2"  "month 3"  "month 4"  "month 5"  "month 6" 
#>  [7] "month 7"  "month 8"  "month 9"  "month 10" "month 11" "month 12"

ggplot(df_fact, aes(x = time, y = value, color = mylabel)) +
  geom_point(size = 7)

您可以进一步调整色阶,使其更适合顺序数据。我经常使用 Color Brewer 的,但也喜欢一些 rcartocolor 秤。在这种情况下,具有 12 个级别将使许多连续调色板中可用的颜色数量最大化,尽管 ggplot2(例如 scale_color_viridis_d)附带的 Viridis 比例尺将插入以适应这么多级别。

reprex package (v0.2.1) 于 2018 年 11 月 30 日创建

【讨论】:

  • 不错,但你有点作弊:) 你的因素已经以正确的方式订购了!呵呵
  • 在最初的问题中,您的问题也是如此,对吧?在 12 点之前订购 2 个,等等。直到 cmets 才出现问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多