[英]R ggplot2: Highlight Values in Stacked Barplot
I have a small dataframe called Participants10 (from dput()
):我有一个名为 Participants10 的小型 dataframe (来自
dput()
):
structure(list(AUC_numeric = c(0.59, 0.68, 0.57, 0.59, 0.74,
0.53, 0.63, 0.59, 0.62, 0.51, 0.78, 0.55, 0.5, 0.5, 0.61), AUC_Factor = structure(c(3L,
2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 2L, 1L), .Label = c("aEMA",
"pEMA", "fEMA"), class = "factor"), ParticipantNr = c(1L, 1L,
1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L), lab_ypos = c(0.295,
0.93, 1.555, 0.295, 0.96, 1.595, 0.315, 0.925, 1.53, 0.255, 0.9,
1.565, 0.25, 0.75, 1.305)), class = c("grouped_df", "tbl_df",
"tbl", "data.frame"), row.names = c(NA, -15L), groups = structure(list(
ParticipantNr = 1:5, .rows = list(1:3, 4:6, 7:9, 10:12, 13:15)), row.names = c(NA,
-5L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))
With ggplot I want to create a stacked bar plot like this:使用 ggplot 我想创建一个堆积条 plot ,如下所示:
ggplot(data = Participants10, aes(x = ParticipantNr, y = AUC_numeric))+
geom_col(aes(fill = factor(AUC_Factor), width = 0.5)) +
geom_text(aes(y = lab_ypos, label = AUC_numeric, group = factor(AUC_Factor) ), color = "white", parse = T)+
theme(legend.title = element_blank(),
panel.background = element_blank(),
panel.grid = element_blank()) +
coord_flip()
How can I highlight (for example with color or with bold text or with sourrounding edges the highest value in the stacked bar for each ParticipantNR?如何突出显示(例如使用颜色或粗体文本或周围边缘)每个 ParticipantNR 的堆叠条中的最高值?
There might be an existing package that might fit your needs but this is one way of emphasizing parts of your plot.可能有一个现有的 package 可能满足您的需求,但这是强调 plot 部分的一种方式。
You can map values you will use in your aes()
like size and color in this example, to the data frame you pass into ggplot()
.您可以将在
aes()
中使用的 map 值(如本例中的大小和颜色)传递给您传递给ggplot()
的数据框。
library(dplyr)
library(tibble)
Participants10 <- Participants10 %>%
mutate(ismax = AUC_numeric == max(AUC_numeric)) %>%
mutate(size = ifelse(ismax, 10, 4)) %>% #size for the text
mutate(isline = ifelse(ismax, "grey25", NA)) %>% #line around rectangle
mutate(line = ifelse(ismax, 1.5, NA)) #whether to show the line around the rectangle or not
You can use them later when in specify the breaks using the scales_*_identity()
, which takes a named vector of the respective values you want mapped.您可以稍后在使用
scales_*_identity()
指定中断时使用它们,它采用您要映射的各个值的命名向量。
Participants10 %>%
ggplot(aes(x = ParticipantNr, y = AUC_numeric)) +
geom_col(aes(fill = factor(AUC_Factor), col = isline, size = line)) + #added col and size here
geom_text(aes(y = lab_ypos, label = AUC_numeric, group = factor(AUC_Factor), size = size), color = "white")+
scale_size_identity(breaks = tibble::deframe(distinct(Participants10, ParticipantNr, size))) + #added scale for size
scale_color_identity(breaks = tibble::deframe(distinct(Participants10, ParticipantNr, line))) + #added scale for color
theme(legend.title = element_blank(),
panel.background = element_blank(),
panel.grid = element_blank()) +
coord_flip()
You can tinker with actual values depending on the dimensions of your output.您可以根据 output 的尺寸修改实际值。
One approach is to precompute the group to highlight.一种方法是预先计算要突出显示的组。 I'll use
dplyr
:我将使用
dplyr
:
Here, we set highlight
to "yes"
when it is the maximum value for each ParticipantNr
.在这里,当它是每个
ParticipantNr
的最大值时,我们将highlight
设置为"yes"
。 Then we can use scale_color_manual
to change the text color based on the highlight
variable.然后我们可以使用
scale_color_manual
根据highlight
变量改变文本颜色。
library(dplyr)
library(ggplot2)
Participants10 %>%
group_by(ParticipantNr) %>%
mutate(highligth = case_when(AUC_numeric == max(AUC_numeric) ~ "yes",
TRUE ~ "no")) %>%
ggplot(aes(x = ParticipantNr, y = AUC_numeric)) +
geom_col(aes(fill = factor(AUC_Factor), color = highligth),
width = 0.5) +
geom_text(aes(y = lab_ypos, label = AUC_numeric,
group = factor(AUC_Factor),color = highligth )) +
scale_color_manual(values = c("no" = "white", "yes" = "black"), guide = FALSE) +
theme(legend.title = element_blank(),
panel.background = element_blank(),
panel.grid = element_blank()) +
coord_flip()
Unfortunately, the outline option doesn't really look great because of clipping between bar regions.不幸的是,由于条形区域之间的剪辑,轮廓选项看起来并不好。
Participants10 %>%
group_by(ParticipantNr) %>%
mutate(highligth = case_when(AUC_numeric == max(AUC_numeric) ~ "yes",
TRUE ~ "no")) %>%
ggplot(aes(x = ParticipantNr, y = AUC_numeric)) +
geom_col(aes(fill = factor(AUC_Factor), color = highligth), width = 0.5) +
geom_text(aes(y = lab_ypos, label = AUC_numeric, group = factor(AUC_Factor),color = highligth ), parse = T) +
scale_color_manual(values = c("no" = "white", "yes" = "black"), guide = FALSE) +
theme(legend.title = element_blank(),
panel.background = element_blank(),
panel.grid = element_blank()) +
coord_flip()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.