R + ggplot。在与父数据相同的图中绘制子数据

时间:2016-12-25 11:08:18

标签: r ggplot2 bar-chart visualization

拥有泰坦尼克号数据集我会根据乘客类别绘制年龄/性别的直方图。

str(titanic)提供以下数据

> 'data.frame': 714 obs. of  4 variables:  
$ Survived: int  0 1 1 1 0 0 0 1 1 1 ...  
$ Pclass  : int  3 1 3 1 3 1 3 3 2 3 ...  
$ Sex     : chr "male" "female" "female" "female" ...  
$ Age     : num  22 38 26 35 35 54 2 27 14 4 ...

首先,我制作了一个男性/女性与旅行班比例的情节。

已由

完成
ggplot(data = titanic, aes(x = factor(Age), fill = factor(Sex))) + 
  geom_bar(position = "dodge", aes(y = (..count..)/sum(..count..))) + 
  facet_grid(. ~ Pclass) + scale_x_discrete(breaks=c(20,40,60)) + 
  ylab("Frequency") + xlab("Age") + 
  scale_fill_discrete(name  = "Sex")

enter image description here

现在我想使用相同的图表,但添加其他信息 - >所有类别的幸存者比例。 例如,20-30岁的女性在第一级旅行的比例是多少。

我希望在相同的条形图中看到它,即将每列分成两部分(幸存/未幸存)。

我可以用ggplot吗?如果是的话,怎么样?

1 个答案:

答案 0 :(得分:1)

使用内置的泰坦尼克号数据集,我可以大致向您展示@Axeman在评论中建议的内容。请注意,它只有两个年龄类别(儿童/成人),因此您需要决定如何对数据进行分区。

ggplot(as.data.frame(Titanic)
       , aes(y = Freq
             , x = Age
             , fill = Survived)) +
  geom_col() +
  facet_grid(Sex ~ Class)

enter image description here

重要的是,我不确定你是通过以现在的方式显示频率来获得任何东西,因为它们似乎没有显示出与计数有意义的任何有意义的不同。相反,如果你想显示每个幸存下来的组中的比例,你可能最好先计算这些百分比,然后将它们传递给ggplot。以下是使用dplyr的示例。同样,你的年龄箱可以是你想要的任何东西,但请注意,箱子越窄,数据就越嘈杂。

as.data.frame(Titanic) %>%
  group_by(Class, Sex, Age) %>%
  mutate(Proportion = Freq/ sum(Freq)) %>%
  ggplot(aes(y = Proportion
             , x = Age
             , fill = Survived)) +
  geom_col() +
  facet_grid(Sex ~ Class)

enter image description here