Question: Ggplot2 : Plotting Multiple Bar Against Same Y Axis. Visualization Of Samples!
0
gravatar for k.nirmalraman
5.1 years ago by
k.nirmalraman910
Germany
k.nirmalraman910 wrote:

Dear All,

I would like to plot a multiple bar plot as shown below against the same y axis. So, I can observe the trend across different samples.

a<-c(rep("C1",3),rep("C2",5),rep("C4",4))
des<-c("ab","cd","de","ab","cd","de","ef","fg","ab","bc","cd","de")
count<-c(23:34)
x<-data.frame(a,des,count)
ggplot(x,aes(x=des,y=count,fill=a))+geom_bar(position="fill")+coord_flip()

I get the following image with some warnings.

Output

Mapping a variable to y and also using stat="bin".
With stat="bin", it will attempt to set the y value to the count of cases in each group.
This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
If you want y to represent values in the data, use stat="identity".
See ?geom_bar for examples. (Deprecated; last used in version 0.9.2)

What I would like is to have multiple plots from different dataframes like x in above example and be able to plot them one next to each other such that the y axis is same... so comparison of such a trend across samples would be possible.

I am wondering,

  1. how to achieve the ordering in y axis and
  2. if a particular y axis element is not present in another dataframe, would it be possible to have a blank space in the corresponding bar space of the graph?

Any help will be very much appreciated. Thanks a lot in advance!

visualization • 5.7k views
ADD COMMENTlink modified 8 months ago by Biostar ♦♦ 20 • written 5.1 years ago by k.nirmalraman910

For aligning your plots, you will need to look at the gridExtra package and you can use +scale_x_discrete() to manually order your samples across the plots (what you are called the "y axis" is the x-axis because you used coord_flip() in your call to ggplot). I didn't test anything, but that should be a start. As far as the warnings, did you try +geom_bar(stat="identity")? The warnings give clear advice on what to do and where to get more information.

ADD REPLYlink modified 5.1 years ago • written 5.1 years ago by SES8.1k
3
gravatar for Ido Tamir
5.1 years ago by
Ido Tamir4.8k
Austria
Ido Tamir4.8k wrote:
x2 <- data.frame(x, batch="A")
x3 <- data.frame(x, batch="B")
x4 <- data.frame(x, batch="C")
comb <- rbind(x2,x3,x4)
comb2 <- comb[!(comb$des == "cd" & comb$batch == "B"), ]
ggplot(comb2,aes(x=des,y=count,fill=a)) + geom_bar(stat="identity", position="fill") + facet_grid( . ~ batch)
ggplot(comb2,aes(x=des,y=count,fill=a)) + geom_bar(stat="identity") + facet_grid( . ~ batch)

for reordering see: http://stackoverflow.com/questions/5208679/order-bars-in-ggplot2-bar-graph

ADD COMMENTlink written 5.1 years ago by Ido Tamir4.8k

This is awesome!! Cant thank you enough!!

ADD REPLYlink written 5.1 years ago by k.nirmalraman910

I couldnt succeed much with oredering from all my attempts.. My Bad!! would you be able to help me to achieve the following..

I would like the order of x2 based on des to be retained and then followed by those in x3 but not in x2 at the end and those in x4 but not in x2 & x3 .

At the least it would be great to retain the order of x2 and the rest followed by it! Now the order is based on alphabetical order.... (apparently the mock data is ordered alpahbetically)

Thanks a lot!!

ADD REPLYlink modified 5.1 years ago • written 5.1 years ago by k.nirmalraman910
0
gravatar for k.nirmalraman
5.1 years ago by
k.nirmalraman910
Germany
k.nirmalraman910 wrote:

Just to document it here...

the ordering can be achieved with passing the argument for aes ggplot(comb2, aes(x=factor(Des,levels=unique(Des)),y=....

ADD COMMENTlink written 5.1 years ago by k.nirmalraman910
Please log in to add an answer.

Help
Access

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 2.3.0
Traffic: 633 users visited in the last hour