I have a small dataframe called Participants10 (from 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(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?
There might be an existing package that might fit your needs but this is one way of emphasizing parts of your 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()
.
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.
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.
One approach is to precompute the group to highlight. I'll use dplyr
:
Here, we set highlight
to "yes"
when it is the maximum value for each ParticipantNr
. Then we can use scale_color_manual
to change the text color based on the highlight
variable.
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()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.