ggplot 和 R:当某些 x 值丢失时,条形图和条形图的宽度出现问题

3 r ggplot2

我有一个特定的数据集,显示了两家公司在 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)
Run Code Online (Sandbox Code Playgroud)

输出:

> year name sales
> 2009    A    500
> 2011    A   1000
> 2012    A   2000
> 2009    B   1500
> 2010    B   1000
> 2012    B    500
Run Code Online (Sandbox Code Playgroud)

请注意,对于 A 公司,没有 2010 年的销售额(当年没有销售额),而对于 B 公司,则没有 2011 年的销售额。

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

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

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

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

如何在不更改数据和添加零的情况下执行此操作?

Gre*_*gor 5

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

制作ggplot不存在的绘图数据通常很困难。将facet在@Thomas K公司的答案选项的作用,因为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")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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)
Run Code Online (Sandbox Code Playgroud)