简体   繁体   中英

R ggplot2: Highlight Values in Stacked Barplot

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM