ggplot:如何在 geom_rect 中获得颜色不同于其他几何图形的半透明填充? fill=alpha() 似乎不起作用
ggplot: how to get a semi-transparent fill in a geom_rect with a color different from other geoms? fill=alpha() does not seem to work
我正在尝试可视化 Covid-19 之前和之后的外科手术:
如您所见,我有一个 geom_rect()
颜色不同于 geom_point()
。
我希望 geom_rect()
中的蓝色 color
和 fill
是半透明的,类似于 fill = alpha("#2C77BF", .5))
。但是,当使用下面的脚本时,alpha
部分不起作用。
对于与 geom_point()
指定的颜色不同的颜色,如何获得 geom_rect()
的半透明?
ggplot(b,
aes(x = cons_week, y = n, color = corona, fill = corona)) +
geom_point(size = 5, shape = 21) +
geom_smooth(se = F, method = lm, color = "black", show.legend = F) +
geom_smooth(lty = 2, show.legend = F) +
geom_segment(aes(x = 167, xend = 167, y = 2.5, yend = 25),
color = "red", size = 1) +
geom_rect(aes(xmin = 1, xmax = 30,
ymin = 0, ymax = 5),
color = "#2C77BF",
fill = alpha("#2C77BF", .5)) +
scale_color_manual(name = "",
values = c("#8B3A62", "#6DBCC3"),
labels = c("COVID-19", "Normal"),
guide = guide_legend(reverse=TRUE)) +
scale_fill_manual(name = "",
values = alpha(c("#8B3A62", "#6DBCC3"), .25),
labels = c("COVID-19", "Normal"),
guide = guide_legend(reverse=TRUE)) +
scale_x_continuous(name = "",
breaks = seq(0, 210, 12)) +
scale_y_continuous(name = "",
breaks = seq(0, 30, 5), limits = c(0, 30)) +
theme(axis.title.y = element_text(color = "grey20",
size = 17,
face="bold",
margin=ggplot2::margin(r=10)),
axis.line = element_line(colour = "black"),
axis.text.x = element_text(color = "white", size = 20),
axis.ticks.x = element_blank(),
panel.grid.major = element_line(colour = "grey90"),
panel.grid.minor = element_line(colour = "grey90"),
panel.border = element_blank(),
panel.background = element_blank(),
legend.position = "top",
legend.key = element_rect(fill = "white"),
legend.text=element_text(size=15))
数据
b <- structure(list(corona = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("C19", "Normal"
), class = "factor"), cons_week = c(185, 176, 190, 201, 184,
170, 202, 179, 203, 178, 206, 208, 209, 193, 181, 168, 191, 171,
192, 195, 186, 175, 187, 174, 207, 169, 205, 197, 200, 173, 204,
199, 189, 180, 194, 188, 182, 177, 196, 183, 124, 111, 75, 148,
27, 158, 1, 62, 11, 56, 57, 154, 141, 51, 112, 159, 116, 8, 126,
121, 38, 9, 78, 122, 32, 63, 94, 129, 76, 43, 44, 103, 84, 89,
92, 37, 67, 19, 73, 142), n = c(17L, 9L, 16L, 15L, 12L, 9L, 15L,
17L, 11L, 12L, 15L, 14L, 12L, 15L, 13L, 11L, 17L, 14L, 15L, 11L,
19L, 14L, 16L, 15L, 14L, 13L, 20L, 18L, 9L, 20L, 20L, 18L, 15L,
10L, 13L, 14L, 21L, 13L, 23L, 18L, 14L, 7L, 14L, 13L, 12L, 14L,
14L, 16L, 19L, 10L, 14L, 11L, 18L, 12L, 18L, 8L, 10L, 15L, 19L,
21L, 17L, 11L, 10L, 11L, 14L, 18L, 15L, 13L, 17L, 18L, 15L, 14L,
17L, 9L, 16L, 15L, 17L, 17L, 13L, 12L)), row.names = c(NA, -80L
), groups = structure(list(corona = structure(1:2, .Label = c("C19",
"Normal"), class = "factor"), .rows = structure(list(1:40, 41:80), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -2L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
您使用了错误的功能。使用 annotate() 代替 geom_rect(),并将 alpha 参数放入其中。你也不需要 aes().
(...) +
annotate(geom = "rect", xmin = 1, xmax = 30,
ymin = 0, ymax = 5,
color = "#2C77BF",
fill = "#2C77BF", alpha = 0.5) +
(...)
@brunosm的回答就是解决这个问题的方法。根据 r2evans 的建议,我提供了一个更能说明 alpha 在与 geom_rect()
一起使用时似乎不起作用的原因 的答案。事实上,您实际上仍然可以使用 geom_rect()
,尽管 annotate()
是更好的选择。
答案在于geom_rect()
和annotate(geom="rect"...
之间的内在差异。也就是说 geoms
根据你的 data=
画东西,而 annotate()
不会。
实际来说,通过演示最容易看出来。您已经发布过当您使用下面的代码时会得到一个实心框。请注意,在这种情况下,p
是您的整个情节代码 ,没有 geom_rect()
部分:
p <- # your plot code entirely, but leave out geom_rect()
p + geom_rect(
aes(xmin = 1, xmax = 30, ymin = 0, ymax = 5),
color = "#2C77BF", fill = alpha("#2C77BF", .5))
该代码为您提供了一个纯蓝色矩形,看起来 alpha 不起作用。实际上,情况并非如此,alpha 的设置工作得很好。让我们看下面的反例。我将绘制相同的图,但这次仅将数据集 b
中的第一个观察值传递给 geom_rect()
。注意不同的结果:
p + geom_rect(data=b[1,],
aes(xmin = 1, xmax = 30, ymin = 0, ymax = 5),
color = "#2C77BF", fill = alpha("#2C77BF", .5))
一切正常!这是因为 geom_rect()
是一个 geom
,它的绘制方法基于源数据,在本例中是整个 b
。这意味着 对于 b
中的每个观察,geom_rect()
正在绘制一个 alpha 为 0.5 的矩形。最后,您得到的深色矩形是 overplotting 的结果 - 在您的数据集的情况下,它是在彼此之上绘制 80 个 alpha = 0.5 矩形的结果.
为了进一步说明,请注意当我将 b
中的两个观察值传递给 geom_rect()
时会发生什么:
p + geom_rect(data=b[1:2,],
aes(xmin = 1, xmax = 30, ymin = 0, ymax = 5),
color = "#2C77BF", fill = alpha("#2C77BF", .5))
我们的矩形现在有点暗,因为 ggplot
在同一位置绘制两个矩形。
这里的底线是 annotate()
将 data=
来源排除在外。这意味着您不能注释随数据变化的内容,但如果遇到这种情况,您可以使用 geom_rect()
.
我想如果你真的想用 geom_rect()
这样做,那么使用 geom_rect(data=b[1,],...
就没有真正的问题...只是可能 不对 方法。 :)
我正在尝试可视化 Covid-19 之前和之后的外科手术:
如您所见,我有一个 geom_rect()
颜色不同于 geom_point()
。
我希望 geom_rect()
中的蓝色 color
和 fill
是半透明的,类似于 fill = alpha("#2C77BF", .5))
。但是,当使用下面的脚本时,alpha
部分不起作用。
对于与 geom_point()
指定的颜色不同的颜色,如何获得 geom_rect()
的半透明?
ggplot(b,
aes(x = cons_week, y = n, color = corona, fill = corona)) +
geom_point(size = 5, shape = 21) +
geom_smooth(se = F, method = lm, color = "black", show.legend = F) +
geom_smooth(lty = 2, show.legend = F) +
geom_segment(aes(x = 167, xend = 167, y = 2.5, yend = 25),
color = "red", size = 1) +
geom_rect(aes(xmin = 1, xmax = 30,
ymin = 0, ymax = 5),
color = "#2C77BF",
fill = alpha("#2C77BF", .5)) +
scale_color_manual(name = "",
values = c("#8B3A62", "#6DBCC3"),
labels = c("COVID-19", "Normal"),
guide = guide_legend(reverse=TRUE)) +
scale_fill_manual(name = "",
values = alpha(c("#8B3A62", "#6DBCC3"), .25),
labels = c("COVID-19", "Normal"),
guide = guide_legend(reverse=TRUE)) +
scale_x_continuous(name = "",
breaks = seq(0, 210, 12)) +
scale_y_continuous(name = "",
breaks = seq(0, 30, 5), limits = c(0, 30)) +
theme(axis.title.y = element_text(color = "grey20",
size = 17,
face="bold",
margin=ggplot2::margin(r=10)),
axis.line = element_line(colour = "black"),
axis.text.x = element_text(color = "white", size = 20),
axis.ticks.x = element_blank(),
panel.grid.major = element_line(colour = "grey90"),
panel.grid.minor = element_line(colour = "grey90"),
panel.border = element_blank(),
panel.background = element_blank(),
legend.position = "top",
legend.key = element_rect(fill = "white"),
legend.text=element_text(size=15))
数据
b <- structure(list(corona = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("C19", "Normal"
), class = "factor"), cons_week = c(185, 176, 190, 201, 184,
170, 202, 179, 203, 178, 206, 208, 209, 193, 181, 168, 191, 171,
192, 195, 186, 175, 187, 174, 207, 169, 205, 197, 200, 173, 204,
199, 189, 180, 194, 188, 182, 177, 196, 183, 124, 111, 75, 148,
27, 158, 1, 62, 11, 56, 57, 154, 141, 51, 112, 159, 116, 8, 126,
121, 38, 9, 78, 122, 32, 63, 94, 129, 76, 43, 44, 103, 84, 89,
92, 37, 67, 19, 73, 142), n = c(17L, 9L, 16L, 15L, 12L, 9L, 15L,
17L, 11L, 12L, 15L, 14L, 12L, 15L, 13L, 11L, 17L, 14L, 15L, 11L,
19L, 14L, 16L, 15L, 14L, 13L, 20L, 18L, 9L, 20L, 20L, 18L, 15L,
10L, 13L, 14L, 21L, 13L, 23L, 18L, 14L, 7L, 14L, 13L, 12L, 14L,
14L, 16L, 19L, 10L, 14L, 11L, 18L, 12L, 18L, 8L, 10L, 15L, 19L,
21L, 17L, 11L, 10L, 11L, 14L, 18L, 15L, 13L, 17L, 18L, 15L, 14L,
17L, 9L, 16L, 15L, 17L, 17L, 13L, 12L)), row.names = c(NA, -80L
), groups = structure(list(corona = structure(1:2, .Label = c("C19",
"Normal"), class = "factor"), .rows = structure(list(1:40, 41:80), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -2L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
您使用了错误的功能。使用 annotate() 代替 geom_rect(),并将 alpha 参数放入其中。你也不需要 aes().
(...) +
annotate(geom = "rect", xmin = 1, xmax = 30,
ymin = 0, ymax = 5,
color = "#2C77BF",
fill = "#2C77BF", alpha = 0.5) +
(...)
@brunosm的回答就是解决这个问题的方法。根据 r2evans 的建议,我提供了一个更能说明 alpha 在与 geom_rect()
一起使用时似乎不起作用的原因 的答案。事实上,您实际上仍然可以使用 geom_rect()
,尽管 annotate()
是更好的选择。
答案在于geom_rect()
和annotate(geom="rect"...
之间的内在差异。也就是说 geoms
根据你的 data=
画东西,而 annotate()
不会。
实际来说,通过演示最容易看出来。您已经发布过当您使用下面的代码时会得到一个实心框。请注意,在这种情况下,p
是您的整个情节代码 ,没有 geom_rect()
部分:
p <- # your plot code entirely, but leave out geom_rect()
p + geom_rect(
aes(xmin = 1, xmax = 30, ymin = 0, ymax = 5),
color = "#2C77BF", fill = alpha("#2C77BF", .5))
该代码为您提供了一个纯蓝色矩形,看起来 alpha 不起作用。实际上,情况并非如此,alpha 的设置工作得很好。让我们看下面的反例。我将绘制相同的图,但这次仅将数据集 b
中的第一个观察值传递给 geom_rect()
。注意不同的结果:
p + geom_rect(data=b[1,],
aes(xmin = 1, xmax = 30, ymin = 0, ymax = 5),
color = "#2C77BF", fill = alpha("#2C77BF", .5))
一切正常!这是因为 geom_rect()
是一个 geom
,它的绘制方法基于源数据,在本例中是整个 b
。这意味着 对于 b
中的每个观察,geom_rect()
正在绘制一个 alpha 为 0.5 的矩形。最后,您得到的深色矩形是 overplotting 的结果 - 在您的数据集的情况下,它是在彼此之上绘制 80 个 alpha = 0.5 矩形的结果.
为了进一步说明,请注意当我将 b
中的两个观察值传递给 geom_rect()
时会发生什么:
p + geom_rect(data=b[1:2,],
aes(xmin = 1, xmax = 30, ymin = 0, ymax = 5),
color = "#2C77BF", fill = alpha("#2C77BF", .5))
我们的矩形现在有点暗,因为 ggplot
在同一位置绘制两个矩形。
这里的底线是 annotate()
将 data=
来源排除在外。这意味着您不能注释随数据变化的内容,但如果遇到这种情况,您可以使用 geom_rect()
.
我想如果你真的想用 geom_rect()
这样做,那么使用 geom_rect(data=b[1,],...
就没有真正的问题...只是可能 不对 方法。 :)