【问题标题】:ggplot and R: Issue with barplot and the width of the bars when certain x values are missingggplot 和 R:当缺少某些 x 值时,条形图和条形的宽度出现问题
【发布时间】:2015-11-09 16:19:47
【问题描述】:

我有一个数据集,显示了两家公司在 4 年内的销售收入。

year <- c(2009, 2011, 2012, 2009,2010, 2012)
name <- c('A', 'A', 'A', 'B', 'B', 'B')
sales <- c(500, 1000, 2000, 1500, 1000, 500)
df.t <- data.frame(year, name, sales)

输出:

> year name sales
> 2009    A    500
> 2011    A   1000
> 2012    A   2000
> 2009    B   1500
> 2010    B   1000
> 2012    B    500

请注意,对于 A 公司,没有 2010 年的销售数字(该年没有销售),而对于 B 公司,在 2011 年没有销售数字。

我想创建一个漂亮的条形图来显示这些数字。

ggplot(data=df.t, aes(x=year, y=sales, fill=name)) + geom_bar(stat="identity", position="dodge")

但是,这会创建一个条形图,其中 2010 年和 2011 年的条形与其他年份的条形宽度不同。

即使是没有销售的年份,我也想要一个条形图。该条形图的高度为 0。

如何在不更改数据和添加零的情况下做到这一点?

【问题讨论】:

  • 如果您解决了这个问题,那就太好了,这样您的数据框创建中的名称(ynz)与向量的名称(year)匹配namesales)并匹配图中的列名(包括return)。
  • 感谢您的评论。我已经修好了。数据框中的名称现在应该与向量的名称匹配

标签: r ggplot2


【解决方案1】:

即使是没有销售的年份,我也想要一个条形图。该条形图的高度为 0。如何在不更改数据和添加零的情况下做到这一点?

通常很难制作不存在的ggplot 绘图数据。 @Thomas K 的答案中的 facet 选项有效,因为默认情况下 xy 在每个方面都相同,无论数据是否存在。但是,我认为添加零是最好的方法,并不像你想象的那么难。只需添加零。 tidyr::complete 让它变得非常简单。

library(tidyr)
ggplot(complete(df.t, year, name, fill = list(sales = 0)),
       aes(x=year, y=sales, fill=name)) + 
    geom_bar(stat="identity", position="dodge")

注意:这假设您的数据是这样的:

year <- c(2009, 2011, 2012, 2009,2010, 2012)
name <- c('A', 'A', 'A', 'B', 'B', 'B')
sales <- c(500, 1000, 2000, 1500, 1000, 500)
df.t <- data.frame(year, name, sales)

【讨论】:

    【解决方案2】:

    你可以使用facet_grid:

    library(ggplot2)
    
    year <- c(2009, 2011, 2012, 2009,2010, 2012)
    name <- c('A', 'A', 'A', 'B', 'B', 'B')
    sales <- c(500, 1000, 2000, 1500, 1000, 500)
    df.t <- data.frame(year, name, sales)
    
    ggplot(df.t, aes(name, sales, fill = name)) +
      geom_bar(stat = "identity", show.legend = F) +
      facet_grid(. ~ year) +
      theme_bw()
    

    【讨论】:

    • geom_bar(stat = "identity", show.legend = F) 我无法删除图例。不得不改用 + guides(fill=FALSE)
    • @AllYouCanEat86 我使用的是开发版。 guides(fill=F) 将在 ggplot2 的下一版本中被弃用。要安装开发版,您可以运行 install.packages("devtools"); devtools::install_github("hadley/ggplot2")
    猜你喜欢
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2013-03-22
    • 2013-06-02
    • 2022-09-17
    相关资源
    最近更新 更多