how to make single stacked bar chart in ggplot2

前端 未结 2 1643
长发绾君心
长发绾君心 2020-12-16 04:03
Ancestry <- data.frame(Race = c(\"European\", \"African American\", \"Asian\", \"Hispanic\", \"Other\"), Proportion = c(40, 30, 10, 15, 5))
Ancestry %>% 
ggplo         


        
相关标签:
2条回答
  • 2020-12-16 04:35

    We can create a dummy variable to group all enteries into one group and then use geom_bar to create a stacked bar plot and use geom_text to name the Proportions.

    library(ggplot2)
    
    #Dummy group variable
    Ancestry$row <- 1
    
    #Create a label variable
    Ancestry$percent <- (Ancestry$Proportion/sum(Ancestry$Proportion)) * 100
    
    ggplot(Ancestry, aes(x = row,y = Proportion, fill = Race)) +
        geom_bar(stat="identity") + 
        geom_text(aes(label = percent), 
            position = position_stack(vjust = 0.5))
    

    0 讨论(0)
  • 2020-12-16 04:51

    You need to create a dummy variable for x-axis. Then use geom_col which is similar to geom_bar(stat = "identity") to plot the stacked barplot + geom_text to put the text on the bar.

    The plot you showed used theme_economist from the ggthemes package.

    library(tidyverse)
    
    Ancestry <- data.frame(Race = c("European", "African American", "Asian", "Hispanic", "Other"), 
                           Proportion = c(40, 30, 10, 15, 5))
    
    Ancestry <- Ancestry %>% 
      mutate(Year = "2006")
    
    ggplot(Ancestry, aes(x = Year, y = Proportion, fill = Race)) +
      geom_col() +
      geom_text(aes(label = paste0(Proportion, "%")),
                position = position_stack(vjust = 0.5)) +
      scale_fill_brewer(palette = "Set2") +
      theme_minimal(base_size = 16) +
      ylab("Percentage") +
      xlab(NULL)
    

    library(ggthemes)
    
    ggplot(Ancestry, aes(x = Year, y = Proportion, fill = Race)) +
      geom_col() +
      geom_text(aes(label = paste0(Proportion, "%")),
                position = position_stack(vjust = 0.5)) +
      theme_economist(base_size = 14) +
      scale_fill_economist() +
      theme(legend.position = "right", 
            legend.title = element_blank()) +
      theme(axis.title.y = element_text(margin = margin(r = 20))) +
      ylab("Percentage") +
      xlab(NULL)
    

    Created on 2018-08-26 by the reprex package (v0.2.0.9000).

    0 讨论(0)
提交回复
热议问题