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 一个基于 test
是 TRUE
还是 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')
)
我正在尝试根据值使用手动色标绘制我的数据。然而,显示的颜色远不符合我提供的值。 我的数据如下所示:
# 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 一个基于 test
是 TRUE
还是 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')
)