user5031866
user5031866

Reputation:

R ggplot2: Color grouped barplot based on condition / numerical thresholds

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)) 

This is the plot: enter image description here

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

Answers (1)

AlexR
AlexR

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

Related Questions