【问题标题】:ggplot2 displays wrong colors with manual scale [closed]ggplot2使用手动比例显示错误的颜色[关闭]
【发布时间】:2021-08-06 21:06:50
【问题描述】:

我正在尝试使用基于值的手动色标来绘制我的数据。但是,显示的颜色与我提供的值相对应。 我的数据如下所示:

# 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 和黄色之间。

这是我收到的结果:

我错过了什么?

【问题讨论】:

  • 试试scale_fill_manual( ...
  • 如果我改成scale_fill_manual,我根本就没有图表。如果我做相反的事情并在aes 中将fill 更改为color,我会得到灰色条。
  • ...切换到scale_fill_manual时的问题是cut返回的默认标签在逗号后(几乎)没有空格,即cut(runif(10, -1 ,1), c(-Inf, -0.01, 0.01, Inf))给出Levels: (-Inf,-0.01] (-0.01,0.01] (0.01, Inf]。跨度>

标签: r ggplot2 colors bar-chart scale-color-manual


【解决方案1】:

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

您可以在数据中创建一个新列,然后将其发送到ggplot 进行绘图。我们将其称为colour_group,但您可以将其称为任何名称。我们根据avg 的值填充这个新列(我已经制作了示例数据,因为您还没有提供所有数据)。我们使用ifelse() 来测试数据的条件,并根据testTRUE 还是FALSE 返回一个值。

在下面的代码中,colour_group = ifelse(avg &lt; -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')
  )

【讨论】:

    【解决方案2】:

    如果在 aes 中输入 'color=',则必须输入 scale_color_manual。但是如果你像实际所做的那样放置填充,那么命令是 scale_fill_manual

    【讨论】:

    • 嗨 Nacho,欢迎来到 SO!这个答案是一个很好的开始......您能否使用 Kolin 的原始代码并举例说明他们获得所需的颜色映射?此外,格式化答案总是有帮助的,例如如果您引用代码以包装在“`”中,例如scale_fill_manual()
    • 如果我更改为scale_fill_manual,我根本没有图表。如果我做相反的事情并在aes 中将fill 更改为color,我会得到灰色条。所以没有匹配的对给我想要的结果。
    猜你喜欢
    • 2015-08-02
    • 2020-05-08
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多