How to create a geom_bar of two tables using ggplo

2019-07-07 19:42发布

问题:

I have a problem creating a geom_bar two tables using ggplot. I have two tables:

1) 
  characteristic men_weekly_earnings
1     16 to 24 years               493
2     16 to 19 years               392
3     20 to 24 years               507
4     25 to 34 years               755
5     35 to 44 years               964
6     45 to 54 years              1011
7     55 to 64 years              1021
8 65 years and older               942


2)
  characteristic women_weekly_earnings
1     16 to 24 years                 451
2     16 to 19 years                 357
3     20 to 24 years                 468
4     25 to 34 years                 679
5     35 to 44 years                 781
6     45 to 54 years                 780
7     55 to 64 years                 780
8 65 years and older                 740

Each table have data of weekly earnings by a different age. my goal is to combine the two tables into one to be like this.

the x axis is the characteristic column and the y axis is the weekly_earnings column.

For now i tried this code (for the men table, and it's not working

  ggplot(data = men) + geom_col(mapping = aes(x= characteristic,y=  men_weekly_erning))

what can I do now?

Thank you.

回答1:

Welcome to Stack Overflow!

I think your best option would be to stack the two datasets together and then plot them. Something like this:

df_all <- rbind(cbind(setNames(men_df, c("characteristic", "weekly_earnings")), source = "men"),
                cbind(setNames(women_df, c("characteristic", "weekly_earnings")), source = "women"))


ggplot(data = df_all) + 
   geom_col(mapping = aes(x= source, y =  weekly_earnings, fill = characteristic), position = position_dodge())

Notice how when I create df_all I'm adding a column specifying the source (either "men"/"women") depending on where the data came from. This allows you to break it out in the ggplot call. Also note the I had to make the column names consistent between the two datasets before stacking. I used the setNames command for this.


Data:

women_df <- structure(list(characteristic = c("16 to 24 years", "16 to 19 years", 
"20 to 24 years", "25 to 34 years", "35 to 44 years", "45 to 54 years", 
"55 to 64 years", "65 years and older"), women_weekly_earnings = c(451L, 
357L, 468L, 679L, 781L, 780L, 780L, 740L)), .Names = c("characteristic", 
"women_weekly_earnings"), row.names = c(NA, -8L), class = "data.frame")

men_df <- structure(list(characteristic = c("16 to 24 years", "16 to 19 years", 
"20 to 24 years", "25 to 34 years", "35 to 44 years", "45 to 54 years", 
"55 to 64 years", "65 years and older"), men_weekly_earnings = c(493L, 
392L, 507L, 755L, 964L, 1011L, 1021L, 942L)), .Names = c("characteristic", 
"men_weekly_earnings"), row.names = c(NA, -8L), class = "data.frame")