Как добавить строку в geom_col() в R

#r #ggplot2

#r #ggplot2

Вопрос:

Как добавить строку с общим количеством людей (или, что еще лучше, затенить область под этой линией в качестве фона) к каждому графику, создаваемому:

 library(ggplot2)
library(readxl)
library(dplyr)
library(RColorBrewer)
        
         dataset %>% 
    ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))   
                geom_col()  
                facet_wrap(~ office) 
                scale_fill_brewer(palette = "RdYlGn") 
                theme_classic() 
                theme(
                  strip.background = element_blank(),
                  strip.text.x = element_blank()
                )
  

Я перепробовал много версий geom_hline, но ни одна из них не работала.

Мой набор данных:

 region   office    Nr_Individuals    total_Nr_Individuals    PovertyDecile   weighted_PovDecile
   1       A             80                 105                   2                2.5
   1       A             23                 105                   3                2.5
   1       B             2                  105                   4                4
   2       C             100                160                   1                1.5   
   2       C             60                 160                   2                1.5
   3       D             20                 70                    8                9
   3       D             50                 70                    10               9
  

что я получаю, используя #code4 (есть мысли?):
введите описание изображения здесь

без опции gray: введите описание изображения здесь

Ответ №1:

Попробуйте этот подход geom_segment() и задайте стиль полос леденцов для вашего графика следующим образом:

 library(ggplot2)
#Code
df %>% 
  ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))   
  geom_col()  
  geom_segment(aes(x=factor(PovertyDecile),xend=factor(PovertyDecile),yend=total_Nr_Individuals)) 
  geom_point(aes(x=factor(PovertyDecile),y=total_Nr_Individuals,fill=factor(PovertyDecile)),
             shape=21,show.legend = F) 
  facet_wrap(~ office) 
  scale_fill_brewer(palette = "RdYlGn") 
  theme_classic() 
  theme(
    strip.background = element_blank(),
    strip.text.x = element_blank()
  )
  

Вывод:

введите описание изображения здесь

Некоторые используемые данные:

 #Data
df <- structure(list(region = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), office = c("A", 
"A", "B", "C", "C", "D", "D"), Nr_Individuals = c(80L, 23L, 2L, 
100L, 60L, 20L, 50L), total_Nr_Individuals = c(105L, 105L, 105L, 
160L, 160L, 70L, 70L), PovertyDecile = c(2L, 3L, 4L, 1L, 2L, 
8L, 10L), weighted_PovDecile = c(2.5, 2.5, 4, 1.5, 1.5, 9, 9)), class = "data.frame", row.names = c(NA, 
-7L))
  

Вы можете обмануть сегменты над каждой строкой, используя следующий код:

 #Code 2
df %>% 
  ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))   
  geom_errorbar(aes(x=factor(PovertyDecile),
                    y=total_Nr_Individuals,ymin=total_Nr_Individuals,
                    ymax=total_Nr_Individuals,color=factor(PovertyDecile))) 
  geom_col()  
  facet_wrap(~ office) 
  scale_fill_brewer(palette = "RdYlGn") 
  scale_color_brewer(palette = "RdYlGn") 
  theme_classic() 
  theme(
    strip.background = element_blank(),
    strip.text.x = element_blank()
  )
  

Вывод:

введите описание изображения здесь

И для затененного стиля вы можете использовать этот трюк с другими geom_col() , но корректирующими alpha :

 #Code 3
df %>% 
  ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))   
  geom_errorbar(aes(x=factor(PovertyDecile),
                    y=total_Nr_Individuals,ymin=total_Nr_Individuals,
                    ymax=total_Nr_Individuals,color=factor(PovertyDecile))) 
  geom_col(aes(x=factor(PovertyDecile),
               y=total_Nr_Individuals,
               fill=factor(PovertyDecile)),alpha=0.5)  
  geom_col()  
  facet_wrap(~ office) 
  scale_fill_brewer(palette = "RdYlGn") 
  scale_color_brewer(palette = "RdYlGn") 
  theme_classic() 
  theme(
    strip.background = element_blank(),
    strip.text.x = element_blank()
  )
  

Вывод:

введите описание изображения здесь

Обновить:

 #Code 4
df %>% 
  ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))   
  geom_errorbar(aes(x=factor(PovertyDecile),
                    y=total_Nr_Individuals,ymin=total_Nr_Individuals,
                    ymax=total_Nr_Individuals)) 
  geom_col(aes(x=factor(PovertyDecile),
               y=total_Nr_Individuals
               ),alpha=0.6,fill='gray')  
  geom_col()  
  facet_wrap(~ office) 
  scale_fill_brewer(palette = "RdYlGn") 
  theme_classic() 
  theme(
    strip.background = element_blank(),
    strip.text.x = element_blank()
  )
  

Вывод:

введите описание изображения здесь

Для непрерывной строки:

 #Code 5
df %>% 
  ggplot(.,aes(x=factor(PovertyDecile),y=Nr_Individuals,fill=factor(PovertyDecile)))   
  geom_hline(aes(yintercept=total_Nr_Individuals)) 
  geom_col(aes(x=factor(PovertyDecile),
               y=total_Nr_Individuals
  ),alpha=0.6,fill='gray')  
  geom_col()  
  facet_wrap(~ office) 
  scale_fill_brewer(palette = "RdYlGn") 
  scale_color_brewer(palette = "RdYlGn") 
  theme_classic() 
  theme(
    strip.background = element_blank(),
    strip.text.x = element_blank()
  )
  

Вывод:

введите описание изображения здесь

Комментарии:

1. Большое спасибо, Дак, это довольно круто, но у меня много «офисов», поэтому может быть непонятно видеть их все с этими точками… Я пытался найти способ построить линию или затенить область под линией в качестве фона для каждого «офиса» — есть мысли о том, как этого добиться?

2. @DanielaRodrigues Вы имеете в виду горизонтальную линию для каждого столбца?

3. горизонтальная линия с total_Nr_Individuals для каждого «офиса», поэтому над всеми столбцами. В идеале я хотел бы заштриховать область под линией до оси x.. не уверен, возможно ли это?

4. Это именно то, что мне было нужно — большое спасибо. В последний момент, я изменил #2 кода, чтобы получить черную линию, так что у меня есть: «scale_color_manual(values=c(«black»,»black»,»black»,»black»,»black»,»black»,»black»,»black»,»black»,»black»))» Как я могу изменить цвет оттенков на просто серый?

5. @DanielaRodrigues Я добавил дополнительное обновление для задачи, которую вы ищете. Надеюсь, это поможет!