ggplot2 使用手动比例显示错误的颜色

ggplot2 displays wrong colors with manual scale

我正在尝试根据值使用手动色标绘制我的数据。然而,显示的颜色远不符合我提供的值。 我的数据如下所示:

# A tibble: 100 x 2
   chunk      avg  
   <dbl>    <dbl>  
 1     0  0.0202
 2     1  0.0405
 3     2  0.0648
 4     3  0.0405
 5     4  0.0283
 6     5 -0.00806
 7     6 -0.0526
 8     7 -0.0364
 9     8 -0.00810
10     9  0.0243
# ... with 90 more rows

然后我将它通过管道传输到 ggplot2:

data %>%
    ggplot(
        aes(
            chunk,
            avg,
            fill = cut(
                avg,
                c(-Inf, -0.01, 0.01, Inf)
            )
        )
    ) +
    geom_bar(stat = "identity", show.legend = FALSE) +
    scale_color_manual(
        values = c(
            "(-Inf, -0.01)" = "red",
            "[-0.01, 0.01]" = "yellow",
            "(0.01, Inf)" = "green"
        )
    )

如您所见,我想根据值为条形着色,低于 -0.01 红色,高于 0.01 绿色和介于 - 黄色之间。

这是我收到的结果:

我错过了什么?

如果在 aes 中输入 'color=',则必须输入 scale_color_manual。但是如果你把 fill,就像你实际做的那样,那么命令就是 scale_fill_manual

你得到不同颜色的原因我认为是因为ggplot不会自动在你提供的颜色和你提供的组之间建立联系.我不是 100% 确定为什么会这样,但我可以提供解决方案。

您可以在将数据发送到 ggplot 进行绘图之前在数据中创建一个新列。我们将其命名为 colour_group,但您可以随意命名。我们根据 avg 的值填充这个新列(我制作了示例数据,因为您没有提供所有数据)。我们使用 ifelse() 来测试数据的条件,returns 一个基于 testTRUE 还是 FALSE.

的值

在下面的代码中,colour_group = ifelse(avg < -0.01, 'red', NA) 可以朗读为:“如果我的 avg 值小于 -0.01,则 colour_group 列的值设为 'red',否则使其成为 NA”。对于后续行,我们希望 FALSE 结果将结果保留在 colour_group 列中 - 在前几行中生成的结果。

# make sample data
tibble(
  chunk = 1:100,
  avg = rnorm(100, 1, 1)
) %>%
  {. ->> my_data}


# make the new 'colour_group' column
my_data %>%
  mutate(
    colour_group = ifelse(avg < -0.01, 'red', NA),
    colour_group = ifelse(avg > 0.01, 'green', colour_group),
    colour_group = ifelse(avg > -0.01 & avg < 0.01 , 'yellow', colour_group),
  ) %>%
  {. ->> my_data_modified}

现在我们可以绘制数据,并指定我们要使用 colour_group 列作为 fill 美学。当指定 scale_fill_manual 时,我们然后告诉 ggplot 如果我们在 colour_group 列中有 green 的值,我们希望条形为绿色,依此类推对于其他颜色。

my_data_modified %>%
  ggplot(aes(chunk, avg, fill = colour_group))+
  geom_bar(stat = 'identity', show.legend = FALSE)+
  scale_fill_manual(
    values = c('green' = 'green', 'red' = 'red', 'yellow' = 'yellow')
  )

这有点令人困惑,因为必须指定两次颜色。但是,我们可以将 colour_group 的值指定为任何值,例如 1、2、3 或低、中、高。在这种情况下,您将执行相同的代码,但修改 ifelse 语句,并更改 scale_fill_manual 以匹配这些值。例如:

my_data %>%
  mutate(
    colour_group = ifelse(avg < -0.01, 'low', NA),
    colour_group = ifelse(avg > 0.01, 'high', colour_group),
    colour_group = ifelse(avg > -0.01 & avg < 0.01 , 'med', colour_group),
  ) %>%
  {. ->> my_data_modified}

my_data_modified %>%
  ggplot(aes(chunk, avg, fill = colour_group))+
  geom_bar(stat = 'identity', show.legend = FALSE)+
  scale_fill_manual(
    values = c('high' = 'green', 'low' = 'red', 'med' = 'yellow')
  )