将(有序)因子映射到ggplot中的颜色

时间:2018-11-30 15:10:36

标签: r ggplot2 dplyr

考虑此示例

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)

enter image description here

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

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

我该怎么做? 谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用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创建

答案 1 :(得分:1)

as_factor中的forcats函数会按顺序对级别进行排序,而不是首先将所有以“ 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秤。在这种情况下,尽管ggplot2(例如scale_color_viridis_d)随附的Viridis比例尺将进行插值以适合许多等级,但具有12个等级将使许多顺序调色板中可用的颜色数量最大化。

reprex package(v0.2.1)于2018-11-30创建