【问题标题】:How to plot 2 categorical variables on X-axis and two continuous variables as "fill" using ggplot2 package?如何使用 ggplot2 包在 X 轴上绘制 2 个分类变量和两个连续变量作为“填充”?
【发布时间】:2015-05-04 06:10:44
【问题描述】:

我有一个包含两个分类变量的数据集,即Year 和Category 以及两个连续变量TotalSales 和AverageCount。

    Year    Category      TotalSales    AverageCount
1   2013    Beverages      102074.29    22190.06
2   2013    Condiments      55277.56    14173.73
3   2013    Confections     36415.75    12138.58
4   2013    Dairy Products  30337.39    24400.00
5   2013    Seafood         53019.98    27905.25
6   2014    Beverages       81338.06    35400.00
7   2014    Condiments      55948.82    19981.72
8   2014    Confections     44478.36    24710.00
9   2014    Dairy Products  84412.36    32466.00
10  2014    Seafood         65544.19    14565.37

在 MS Excel 中,我们可以很高兴地获得同一张表的透视图,其中 Year 和 Category 作为 AXIS,TotalSales 和 AverageCount 作为 sigma 值。

使用 R,如何绘制如图所示的图形,分类变量在同一个图形中显示为多个层?

附:我可以看到的一个选项是,通过将数据框拆分为两个单独的数据框(在我们的示例中,一个用于 2013 年,另一个用于 2014 年),并在一个图上绘制两个图表,排列成多行以获得相同的效果。但是有没有办法画如上图呢?


上面使用的样本数据

dat <- structure(list(Year = c(2013L, 2013L, 2013L, 2013L, 2013L, 2014L, 
2014L, 2014L, 2014L, 2014L), Category = structure(c(1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c("Beverages", "Condiments", 
"Confections", "Dairy Products", "Seafood"), class = "factor"), 
    TotalSales = c(102074.29, 55277.56, 36415.75, 30337.39, 53019.98, 
    81338.06, 55948.82, 44478.36, 84412.36, 65544.19), AverageCount = c(22190.06, 
    14173.73, 12138.58, 24400, 27905.25, 35400, 19981.72, 24710, 
    32466, 14565.37)), .Names = c("Year", "Category", "TotalSales", 
"AverageCount"), class = "data.frame", row.names = c(NA, -10L
)

【问题讨论】:

  • 或许你可以先把reshape2::melt这两个变量转长格式? (未测试..)

标签: r ggplot2


【解决方案1】:

您需要首先重新格式化您的数据,因为 @EDi 向您展示了如何在 cmets 中建议的一个较早的问题 (ggplot : Multi variable (multiple continuous variable) plotting) 和 @docendo discimus 中进行。

library(reshape2)
dat_l <- melt(dat, id.vars = c("Year", "Category"))

然后你可以像这样使用分面:

library(ggplot2)
p <- ggplot(data = dat_l, aes(x = Category, y = value, group = variable, fill = variable))
p <- p + geom_bar(stat = "identity", width = 0.5, position = "dodge")
p <- p + facet_grid(. ~ Year)
p <- p + theme_bw()
p <- p + theme(axis.text.x = element_text(angle = 90))
p

如果您对使图形更符合 Excel 外观特别感兴趣,这里的答案中有一些策略可能会有所帮助:How do I plot charts with nested categories axes?。

您的原始数据采用更易于粘贴的格式:

dat <- structure(list(Year = c(2013L, 2013L, 2013L, 2013L, 2013L, 2014L, 
2014L, 2014L, 2014L, 2014L), Category = structure(c(1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c("Beverages", "Condiments", 
"Confections", "Dairy Products", "Seafood"), class = "factor"), 
    TotalSales = c(102074.29, 55277.56, 36415.75, 30337.39, 53019.98, 
    81338.06, 55948.82, 44478.36, 84412.36, 65544.19), AverageCount = c(22190.06, 
    14173.73, 12138.58, 24400, 27905.25, 35400, 19981.72, 24710, 
    32466, 14565.37)), .Names = c("Year", "Category", "TotalSales", 
"AverageCount"), class = "data.frame", row.names = c(NA, -10L
))

【讨论】:

  • 看准了!它有帮助.. 其次,如果我还有一个分类变量,我可以做出什么样的改进,以便我有一个像样的输出? (虽然我觉得我应该把它作为一个新问题添加)
  • 很高兴它帮助了@sunitprasad1。当您说“另一个分类变量”时,您在考虑哪个变量?年份、产品类别或价值类型?对于其中任何一个,如果您将额外的级别添加到数据框中,则应使用相同的代码将它们添加到绘图中。不过我可能会误解这个问题。
  • 我同时试过了。我使用的表有Year, Quarter, Product and Category 和Sales, Count。我想知道如果我将Quarter 添加到此代码中,我应该如何以用户可读的格式格式化、重组或排列数据并看看它是如何进行的。好吧,添加第三个变量后的图表虽然信息丰富,但非常令人困惑。我想我应该更多地尝试您在答案中提供的链接。将发布一个新问题,以防我被卡住。
  • @sunitprasad1,如果您使用年份和季度,听起来您可能希望通过 2 个变量来分面。查看 R 的 Cookbook,了解一些具有 2 个变量 cookbook-r.com/Graphs/Facets_(ggplot2) 的刻面的好示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多