Vitalijs
Vitalijs

Reputation: 950

Proportional barplot in R

I am trying to create a proportional barplot in R, so far I have managed to do something like this:

library(ggplot2)
ggplot(data=diamonds)+
  geom_bar(aes(x=cut,y=..prop..,fill=color))

This obviously does not work, but neither does this:

ggplot(data=diamonds)+
  geom_bar(aes(x=cut,y=..prop..,fill=color,group=1))

or this:

ggplot(data=diamonds)+
  geom_bar(aes(x=cut,y=..count../sum(..count..),fill=color))

This works:

ggplot(data=diamonds)+
  geom_bar(aes(x=cut,y=..count../sum(..count..),fill=color),position="fill")

But I would like bars to be side by side within a category.

What I want to do is to get proportional barplot without transforming my data before

Upvotes: 1

Views: 1200

Answers (2)

h3rm4n
h3rm4n

Reputation: 4187

I think you need to aggregate first and then use position="dodge":

diamonds2 <- aggregate(carat ~ cut + color, diamonds, length)

ggplot(data = transform(diamonds2, p = ave(carat, cut, FUN = function(x) x/sum(x))), 
       aes(x = cut, y = p, fill=color))+
  geom_bar(stat = "identity", position = "dodge")

The resulting plot:

enter image description here

Upvotes: 1

Avitus
Avitus

Reputation: 744

EDIT after OP's comment

If you want conditional and side-by-side histograms use geom_bar(stat = "identity", position = "dodge") when you call your conditional histogram plot with ggplot2 (I display the first 100 rows of data for sake of clarity)

library(ggplot2)
ggplot(data = diamonds[1:100, ], aes(cut, carat, fill = color)) + geom_bar(stat = "identity", position = "dodge")

Upvotes: 0

Related Questions