rggplot2geom-col

Creating a stacked bar chart (using data from 2 columns)


I am trying to create a stacked bar chart but unable to create the 'stack part'. I wish to have my bar height as the gdp_per_capita column and I then wish to show the gdp_per_capita_agg_percen column as part of each column (this is as a percentage of my gdp_per_capita column). Just to be clearer here for country 1 i need a column value of 3281 then the stack part inside it to be 676 (20.6% of it).

Data and code used below;

data

 df2
   Country_Name            gdp_per_capita     `Agriculture_GDP%`  gdp_per_capita_agg_percen
 1 Albania                         3281               20.6                      676
 2 Algeria                         3515               9.86                      346
 3 Bosnia and Herzegovina          3828               8.21                      314
 4 Croatia                        11285               3.90                      440
 5 Cyprus                         24686               2.60                      643
 6 Egypt, Arab Rep.                2192               13.3                      292 

current code with out stacks; I read about using position="stack" in the geom_bar argument but wasnt sure how to add in my gdp_per_capita_agg_percen data for the stack

ggplot(df2, aes(x = as.factor(Country_Name), y = gdp_per_capita, fill = as.factor(Country_Name))) +
geom_bar(stat = "identity")       

Solution

  • Wouldn't call this stacking. But you could achieve your desired result via a second geom_col/bar:

    library(ggplot2)
    
    ggplot(df2, aes(x = as.factor(Country_Name), y = gdp_per_capita, fill = "GDP")) +
      geom_col() +
      geom_col(aes(y = gdp_per_capita_agg_percen, fill = "Agriculture"))   
    

    enter image description here

    DATA

    structure(list(Country_Name = c("Albania", "Algeria", "Bosnia and Herzegovina", 
    "Croatia", "Cyprus", "Egypt, Arab Rep."), gdp_per_capita = c(3281L, 
    3515L, 3828L, 11285L, 24686L, 2192L), `Agriculture_GDP%` = c(20.6, 
    9.86, 8.21, 3.9, 2.6, 13.3), gdp_per_capita_agg_percen = c(676L, 
    346L, 314L, 440L, 643L, 292L)), class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))