首页 > 解决方案 > 标记条形图ggplot的一部分

问题描述

我有不同品牌每年销售的汽车数量的数据,如下所示:

在此处输入图像描述

但我也有关于每个品牌和年份销售的汽车中有多少是配备柴油发动机的汽车的数据。

我希望能够将图表堆叠在条形图中,并为每个类别添加第二个维度,显示有多少汽车具有特定品牌的柴油发动机(例如宝马)。我想通过颜色或如下线来完成:

在此处输入图像描述

是否可以在 R 中做到这一点ggplot

编辑:我的数据:

Excel 中的数据如下所示:

        BMW  Volvo  Audi
2010    50   400    50
2011    75   450    35
2012    45   350    55

        BMW         Volvo   Audi
2010    0.2         0.2     0.5
2011    0.293333333 0.5     0.571428571
2012    0.488888889 0.5     0.272727273

标签: rggplot2

解决方案


您需要做一些数据准备以使其更容易绘制,但是一旦您多次执行此类操作,它就会变得非常简单。我强烈推荐阅读有关整洁数据原则的文章,我将在这里应用。

数据

将来,请通过 的输出发布您的数据框dput(data.frame),但您的表很小,因此导入并不难:

df1 <- data.frame(year=c(2010:2012), BMW=c(50,75,45), Volvo=c(400,450,350), Audi=c(50,35,55))
df2 <- data.frame(year=c(2010:2012), BMW=c(0.2, 0.29333333, 0.4888888), Volvo=c(0.2,0.5,0.5), Audi=c(0.5,0.571428571,0.2727272727272))

您的数据应转换为Tidy Data,其中关键原则是每一行是一个观察,每个变量是一列,每个值代表该观察的该列的值。考虑您的第一个表,其中只有 3 条正在变化的信息(变量):年份、型号和售出的汽车数量。因此,我们需要将 BMW、Volvo 和 Audi 的这三列合并为两列:一列用于型号,一列用于销售数量。您可以通过使用gather()from dplyr(或其他一些方式)来做到这一点。同样,我们需要合并第二个数据集中的列。

然后,您可以将两个数据集合并在一起。最后,我使用来自总销量 * 柴油比例的信息来识别柴油的数量与非柴油的数量。通过这种方式,我们创建了用于绘图的最终数据框:

df1.1 <- df1 %>% gather(key='Model', value='Total_Sold',-year)
df2.1 <- df2 %>% gather(key='Model', value='prop_diesel',-year)
df <- merge(df1.1, df2.1)
df$diesel <- df$Total_Sold * df$prop_diesel
df$non_diesel <- df$Total_Sold - df$diesel
df <- df %>% gather(key='type', value='sold', -(1:4))

阴谋

要创建该图,最好的显示方式似乎是在柱状图中,将“非柴油”和“柴油”堆叠在一起,这样您就可以看到每年每个制造商的总量比较,其中还估计柴油/非柴油的比例。我们有点想使用闪避(将列分开以使它们共享相同的 x 轴值),以及“堆叠”(柴油与非柴油的堆叠信息)。对于柱状图,你有点不能同时这样做,但我正在使用刻面来获得相同的效果。在这里,您将模型指定为 x 轴,对销售量使用堆叠,然后分面以每年创建子集。这是代码和结果:

ggplot(df, aes(x=Model, y=sold)) +
    geom_col(aes(fill=type), position='stack') +
    facet_wrap(~year)

在此处输入图像描述


推荐阅读