如何根据 ggplot2 中的列标记每组的条形图?

How to label bars per group based on a column in ggplot2?

注意:所提供的没有显示如何标记每组已订购的

鉴于此数据集:

   require(dplyr)
   require(ggplot2)
   require(forcats)
   class <- c(1, 4,1,3, 2, 2,4, 1, 4, 5, 2, 4, 2,2,2) 
   prog <- c("Bac2", "Bac2","Bac2","Bac", "Master", "Master","Bac", "Bac", "DEA", "Doctorat", 
   "DEA", "Bac", "DEA","DEA","Bac")
   mydata <- data.frame(height = class, prog)
  ress=mydata %>% group_by(prog,height) %>% 
  tally() %>% mutate(prop = n/sum(n))
   dff=ress %>% 
   group_by(prog) %>% 
    mutate(new = ifelse(any(prop > 0.5), height[prop > 0.5], 99))

可以这样画:

   dff%>%ggplot(aes(x=prog, y=prop, fill=fct_rev(as.factor(height))))+
   geom_col() +
  scale_y_continuous(labels = scales::percent)+
 theme(legend.position = 'null')

我想根据“新”列对条形图重新排序,并像这样标记它们:

这是你想要的吗?

library(tidyverse)

class <- c(1, 4, 1, 3, 2, 2, 4, 1, 4, 5, 2, 4, 2, 2, 2)
prog <- c(
  "Bac2", "Bac2", "Bac2", "Bac", "Master", "Master", "Bac", "Bac", "DEA", "Doctorat",
  "DEA", "Bac", "DEA", "DEA", "Bac"
)
mydata <- data.frame(height = class, prog)
ress <- mydata %>%
  group_by(prog, height) %>%
  tally() %>%
  mutate(prop = n / sum(n))

dff <- ress %>%
  group_by(prog) %>%
  mutate(new = ifelse(any(prop > 0.5), height[prop > 0.5], 99)) |> 
  ungroup()

label_df <- dff %>% group_by(prog) %>% summarise(label = first(new))

dff %>%
  mutate(prog = fct_reorder(prog, desc(new))) %>%
  ggplot(aes(prog, prop)) +
  geom_col(aes(fill = fct_rev(as.factor(height)))) +
  geom_vline(xintercept = c(.5, 1.5, 2.5, 4.5, 5.5)) +
  geom_label(aes(label = label, y = 0.9), data = label_df) +
  scale_y_continuous(labels = scales::percent) +
  theme(legend.position = "null")

reprex package (v2.0.1)

于 2022-05-10 创建

这是您要找的吗:

require(dplyr)
#> Loading required package: dplyr
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
require(ggplot2)
#> Loading required package: ggplot2
require(forcats)
#> Loading required package: forcats
class <- c(1, 4,1,3, 2, 2,4, 1, 4, 5, 2, 4, 2,2,2) 
prog <- c("Bac2", "Bac2","Bac2","Bac", "Master", "Master","Bac", "Bac", "DEA", "Doctorat", 
          "DEA", "Bac", "DEA","DEA","Bac")
mydata <- data.frame(height = class, prog)
ress=mydata %>% 
  group_by(prog,height) %>% 
  tally() %>% 
  mutate(prop = n/sum(n)) %>% 
  ungroup %>% 
  mutate(prog = factor(prog, levels=c("Bac", "Bac2", "Doctorat", "DEA", "Master"))) 
dff=ress %>% 
  group_by(prog) %>% 
  mutate(new = ifelse(any(prop > 0.5), height[prop > 0.5], 99))

dff2 <- dff %>% 
  group_by(prog) %>% 
  slice_tail(n=1) %>% 
  mutate(prog = as.numeric(prog)) %>% 
  group_by(new) %>% 
  summarise(x = mean(as.numeric(prog)))
  


dff%>%ggplot(aes(x=prog, y=prop, fill=fct_rev(as.factor(height))))+
  geom_col() +
  geom_vline(xintercept=c(.5, 1.5, 2.5, 3.5, 5.5), linetype=2) + 
  geom_text(data=dff2, aes(x=x, y=1, label = new), nudge_y = .05, inherit.aes=FALSE) + 
  scale_y_continuous(labels = scales::percent)+
  theme_classic() + 
  theme(legend.position = 'null')

reprex package (v2.0.1)

于 2022-05-10 创建