2
votes

Haven't seen an answer for this problem, but I feel like it should be relatively simple.

library(ggplot2)
Hotels<-data.frame(Year=c(2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017,
                        2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016, 2016,
                        2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015,
                        2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014, 2014,
                        2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013),
                 Day=c('Monday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Thursday', 'Thursday', 'Thursday', 'Thursday', 'Friday', 'Friday', 'Friday', 'Friday', 'Saturday', 'Saturday', 'Saturday', 'Saturday',
                       'Monday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Thursday', 'Thursday', 'Thursday', 'Thursday', 'Friday', 'Friday', 'Friday', 'Friday', 'Saturday', 'Saturday', 'Saturday', 'Saturday',
                       'Monday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Thursday', 'Thursday', 'Thursday', 'Thursday', 'Friday', 'Friday', 'Friday', 'Friday', 'Saturday', 'Saturday', 'Saturday', 'Saturday',
                       'Monday', 'Monday', 'Monday', 'Monday', 'Tuesday', 'Tuesday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Wednesday', 'Thursday', 'Thursday', 'Thursday', 'Thursday', 'Friday', 'Friday', 'Friday', 'Friday', 'Saturday', 'Saturday', 'Saturday', 'Saturday',
                       'Monday', 'Monday', 'Tuesday', 'Tuesday', 'Wednesday', 'Wednesday',  'Thursday', 'Thursday', 'Friday', 'Friday', 'Saturday', 'Saturday'),
                 Code=c('Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other',
                        'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other',
                        'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other',
                        'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other', 'Block', 'Added', 'Pickup Conrad', 'Pickup Other',
                        'Block', 'Pickup', 'Block', 'Pickup', 'Block', 'Pickup','Block', 'Pickup', 'Block', 'Pickup', 'Block', 'Pickup'),
                 Count=c(0,0,2,0,42,0,47,0,159,12,166,17,174,12,182,17,22,0,27,0,0,0,8,0,
                         0,0,3,0,10,30,39,0,127,30,174,18,142,30,203,21,20,0,25,9,0,0,13,0,
                         0,0,4,0,45,0,32,2,145,20,137,8,160,20,161,8,20,0,22,8,0,0,4,0,
                         0,0,5,0,0,8,21,1,59,45,110,25,109,8,126,28,19,2,16,0,0,0,9,0,
                         0,0,0,15,84,102,109,119,19,11,0,4))
 HotelBar<-ggplot(data=Hotels, aes(x=Day, y=as.numeric(Count), fill=Code))+
      geom_bar(aes(fill=Code), position="dodge", stat="identity")+
      scale_x_discrete(limits=c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))+
      facet_grid(Year~.)

HotelBar

Bar Chart

I'd like a simple(ish?) cosmetic change. Instead of having four bars per weekday, I would like only two. I'd like the bars stacked on top of each other. That is, I'd like to see the bar "Block" with the bar "Added" stacked on top of it and I'd like to see the bar "Pickup Conrad" with the bar "Pickup Other" stacked on top of it.(no need to worry about 2013).

Maybe I could create a new variable, total, for each of those two above mentioned bars, and then fill that total by a variable denoting Block, Added, Pickup Conrad and Pickup Other to show the stacked look?

1
Thanks @Michael Kirchner. I saw that post, and I'm not sure that it helps for my problem? My data is already in long form. I think I need to add a variable like 'Hotels$Category<-ifelse(Hotels$Code %in% c('Block', 'Added'), "Contract", ifelse(Hotels$Code %in% c('Pickup Conrad', 'Pickup Other', 'Pickup'), "Actual",''))' and then use that as a fill variable?J. Collins

1 Answers

3
votes

Here is how I would do it:

# Create a fake variable to group the columns into 2 stacks
Hotels$code_stack = ifelse(Hotels$Code %in% c('Block','Added'), 'first_stack', 'second_stack')

# Put the days in the correct order
Hotels$Day = factor(Hotels$Day, c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))

# Display the result...
# Note the `x=code_stack` to plot two columns
# Also note `position="stack"` to stack the barcharts
# The final change of theme removes the x axis
ggplot(data=Hotels, aes(x=code_stack, y=as.numeric(Count), fill=Code))+
  geom_bar(position="stack", stat="identity")+
  facet_grid(Year ~ Day) +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank())

Which gives:

enter image description here