Reputation:
I have the following input for a grouped bar plot that I generate with ggplot2:
Disease;Category;Value;pValue
Disease A;Count;100;0.0001
Disease A;Expected Count;50;0.0001
Disease B;Count;80;0.0005
Disease B;Expected Count;40;0.0005
Disease C;Count;60;0.0010
Disease C;Expected Count;40;0.0010
Disease D;Count;45;0.05
Disease D;Expected Count;50;0.05
The following code generates the grouped barplot:
literature.disease2 <- read.table(file = "/user/literature-disease2.csv",sep=";", header=TRUE)
literature.disease2.sorted <- literature.disease2[order(literature.disease2$pValue,literature.disease2$Category),]
ggplot(data=literature.disease2.sorted, aes(x=Disease, y=Value, fill=Category)) +
geom_bar(stat="identity", position=position_dodge(),size=.3, colour="black") +
scale_fill_manual(values=c("Count" = "lightblue", "Expected Count" = "pink")) + # Change color
xlab("Disease Category") + ylab("Literature Count") + # Set axis labels
ggtitle("Genome-Wide Literature Counts") + # Set title
theme_bw() +
theme(axis.text.x = element_text(angle =90, hjust = 1,vjust=0.5))
Now I would like to color the bars in blue (instead of light blue) and purple (instead of pink) whenever the pValue <= 0.005. I know that I have to change the scale_fill_manual option, but I do not know how to do this for grouped bar plots. Can anyone help?
Thanks in advance, Frank
Upvotes: 1
Views: 1526
Reputation: 2408
This code might get you started, but think about adding significance as, for example, alpha aesthetic instead of double coding.
The key point is using interaction()
as the fill
aesthetic and mapping the colors appropriately.
library(ggplot2)
literature.disease2 <- read.table(text = "Disease;Category;Value;pValue
Disease A;Count;100;0.0001
Disease A;Expected Count;50;0.0001
Disease B;Count;80;0.0005
Disease B;Expected Count;40;0.0005
Disease C;Count;60;0.0010
Disease C;Expected Count;40;0.0010
Disease D;Count;45;0.05
Disease D;Expected Count;50;0.05",sep=";", header=TRUE)
literature.disease2.sorted <- literature.disease2[order(literature.disease2$pValue,literature.disease2$Category),]
ggplot(data=literature.disease2.sorted, aes(x=Disease, y=Value, fill=interaction(Category, pValue <= .005))) +
geom_bar(stat="identity", position=position_dodge(),size=.3, colour="black") +
scale_fill_manual(values=c("Count.FALSE" = "lightblue", "Count.TRUE" = "blue", "Expected Count.FALSE" = "pink", "Expected Count.TRUE" = "purple")) + # Change color
xlab("Disease Category") + ylab("Literature Count") + # Set axis labels
ggtitle("Genome-Wide Literature Counts") + # Set title
theme_bw() +
theme(axis.text.x = element_text(angle =90, hjust = 1,vjust=0.5))
Here is a plot with my suggestion:
ggplot(data=literature.disease2.sorted, aes(x=Disease, y=Value, fill=Category, alpha = pValue <= .005)) +
geom_bar(stat="identity", position=position_dodge(),size=.3, colour="black") +
scale_fill_manual(values=c("Count" = "blue", "Expected Count" = "purple")) + # Change color
scale_alpha_discrete(range = c(0.5, 1)) + # Make the "insignificant" bars a little more visible (default range = c(0.1,1))
xlab("Disease Category") + ylab("Literature Count") + # Set axis labels
ggtitle("Genome-Wide Literature Counts") + # Set title
theme_bw() +
theme(axis.text.x = element_text(angle =90, hjust = 1,vjust=0.5))
Upvotes: 1