简体   繁体   English

R ggplot2:在堆积条形图中突出显示值

[英]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.

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