简体   繁体   中英

Add group information in multiple bar chart with ggplot

Let say I have below multiple bar chart with ggplot

raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)

raw=raw[,c(2,3,4)] 

freq=table(col(raw), as.matrix(raw)) # get the counts of each factor level
Names=c("Food","Music","People")     
data=data.frame(cbind(freq),Names)   
data=data[,c(5,3,1,2,4)]             


data.m <- melt(data, id.vars='Names')


ggplot(data.m, aes(Names, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat="identity")

This is fine. However I want to add some group information along the x-axis . Let say 2 groups are defined as Group1: Food and Music and Group2: People . With this, I am trying build a ggplot like below

在此处输入图像描述

I also want to reduce the space between Food & Music and increase the space between Music & People - just to demonstrate Food & Music form 1 group and People another group.

Is there any way to achieve this using ggplot framework?

There are several options like adding the group information as annotations to your plot. But IMHO a good starting point and the simplest approach would be to use faceting:

Using some fake example data:

library(ggplot2)

variable <- c("Very Bad","Bad","Good","Very Good")

data.m <- data.frame(
  Names = rep(c("Food","Music","People"), each = 4),
  value = 1:12,
  variable = factor(variable, levels = variable)
)
data.m$group <- ifelse(data.m$Names %in% c("Food", "Music"), "Group 1", "Group 2")

ggplot(data.m, aes(Names, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat="identity") +
  facet_grid(.~group, space = "free", scales = "free_x", switch = "x") +
  theme(strip.placement = "outside",
        strip.background.x = element_rect(fill = NA),
        strip.text.x = element_text(color = "red"))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM