我有一个特定的数据集,显示了两家公司在 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。
如何在不更改数据和添加零的情况下执行此操作?
即使是没有销售的年份,我也想要一个条形图。该条形图的高度为 0。如何在不更改数据和添加零的情况下执行此操作?
制作ggplot
不存在的绘图数据通常很困难。将facet
在@Thomas K公司的答案选项的作用,因为x
和y
默认等级表的每一个方面是相同的,不管数据存在/不存在的。但是,我认为添加零是最好的方法,并不像您想象的那么难。只需添加零。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)