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.