Reputation: 98
I am looking to "dodge" the bars of a barplot together. The following R code leaves white space between the bars. Other answers like this one show how to accomplish this for the bars part of a group, but that does not seem to apply for distinct bars per factor on the x axis.
require(ggplot2)
dat <- data.frame(a=c("A", "B", "C"), b=c(0.71, 0.94, 0.85), d=c(32, 99, 18))
ggplot(dat, aes(x= a, y = b, fill=d, width = d/sum(d))) +
geom_bar(position=position_dodge(width = 0.1), stat="identity")
Playing with the width variable changes the appearance, but it does not seem possible to get the bars to sit side by side while still retaining their meaningful difference in width (in this graph redundantly represented by the fill colour too).
Upvotes: 6
Views: 5900
Reputation: 9570
I would generate my x-positions and widths first, then pass them in to the aesthetics and override to make your factor labels:
First, store the width
dat$width <-
dat$d / sum(dat$d)
Then, assuming that your data.frame is in the order you want it plotted, you can set the location as the cumulative sum of the widths. Note, however, that that cumulative sum is where you want the right edge of the bar to be, so to get the center you need to subtract half of the width:
dat$loc <-
cumsum(dat$width) - dat$width/2
Then, pass it all in to the ggplot
call, setting your labels explictly:
ggplot(dat, aes(x= loc, y = b, fill=d, width = width)) +
geom_bar(stat="identity") +
scale_x_continuous(breaks = dat$loc
, labels = dat$a)
gives
I am not sure about the advisability of this appproach, but this should get the job done.
Upvotes: 7
Reputation: 11762
It is possible by using a continuous x axis and relabel it.
ggplot(dat, aes(x=cumsum(d/sum(d))) - d/sum(d)/2, y = b, fill=d, width=d/sum(d))) +
geom_bar(stat="identity", position=position_dodge()) +
scale_x_continuous(breaks=cumsum(dat$d/sum(dat$d)) - dat$d/sum(dat$d)/2, labels=dat$a)
Or isn't this what you where looking for
Upvotes: 5