【发布时间】:2016-02-18 17:20:54
【问题描述】:
我正在尝试使用列出全年库存和销售额的数据重新创建我在 Excel 中创建的条形图。这是我在 Excel 中的图表:
我通过 R 和 ggplot 包来做这件事。我对此很陌生,但这是我迄今为止所管理的:
library(lubridate)
library(ggplot2)
library(scales)
library(reshape2)
COdata <- read.csv("C:/.../CenterOne.csv")
# Grab related data
# VIN refers to a unique inventory identifier for the item
# First Launch Date is what I use to count my inventory for the month
# Sale Date is what I use to count my sales for the month
DFtest <- COdata[, c("VIN", "First.Launch.Date", "Sale.Date")]
以下是数据的快照:
> head(DFtest)
VIN First.Launch.Date Sale.Date
1 4T1BF1FK4CU048373 22/04/2015 0:00
2 2T3KF4DVXCW108677 16/03/2015 0:00
3 4T1BF1FKXCU035935 19/03/2015 0:00 20/03/2015 0:00
4 JTDKN3DU3B1465796 16/04/2015 0:00
5 2T3YK4DV8CW015050
6 4T1BF1FK5CU599556 30/04/2015 0:00
我将日期转换为适当的格式,删除小时/秒并将它们分解为每月间隔:
DFtest$First.Launch.Date <- as.Date(DFtest$First.Launch.Date, format = "%d/%m/%Y")
DFtest$Sale.Date <- as.Date(DFtest$Sale.Date, format = "%d/%m/%Y")
DFtest$month.listings <- as.Date(cut(DFtest$First.Launch.Date, breaks = "month"))
DFtest$month.sales <- as.Date(cut(DFtest$Sale.Date, breaks = "month"))
> head(DFtest)
VIN First.Launch.Date Sale.Date month.listings month.sales
1 4T1BF1FK4CU048373 2015-04-22 <NA> 2015-04-01 <NA>
2 2T3KF4DVXCW108677 2015-03-16 <NA> 2015-03-01 <NA>
3 4T1BF1FKXCU035935 2015-03-19 2015-03-20 2015-03-01 2015-03-01
4 JTDKN3DU3B1465796 2015-04-16 <NA> 2015-04-01 <NA>
5 2T3YK4DV8CW015050 <NA> <NA> <NA> <NA>
6 4T1BF1FK5CU599556 2015-04-30 <NA> 2015-04-01 <NA>
平均线图 - 我尝试创建一个
DF_Listings = data.frame(table(format(DFtest$month.listings)))
DF_Sales = data.frame(table(format(DFtest$month.sales)))
DF_Merge <- merge(DF_Listings, DF_Sales, by = "Var1", all = TRUE)
> head(DF_Listings)
Var1 Freq
1 2014-12-01 77
2 2015-01-01 886
3 2015-02-01 930
4 2015-03-01 1167
5 2015-04-01 1105
6 2015-05-01 1279
DF_Merge$Avg <- DF_Merge$Freq.y / DF_Merge$Freq.x
> head(DF_Merge)
Var1 Freq.x Freq.y Avg
1 2014-12-01 77 NA NA
2 2015-01-01 886 277 0.3126411
3 2015-02-01 930 383 0.4118280
4 2015-03-01 1167 510 0.4370180
5 2015-04-01 1105 309 0.2796380
6 2015-05-01 1279 319 0.2494136
ggplot(DF_Merge, aes(x=Var1, y=Avg, group = 1)) +
stat_smooth(aes(x = seq(length(unique(Var1)))),
se = F, method = "lm", formula = y ~ poly(x, 11))
条形图
dfm <- melt(DFtest[ , c("VIN", "First.Launch.Date", "Sale.Date")], id.vars = 1)
dfm$value <- as.Date(cut(dfm$value, breaks = "month"))
ggplot(dfm, aes(x= value, width = 0.4)) +
geom_bar(aes(fill = variable), position = "dodge") +
scale_x_date(date_breaks = "months", labels = date_format("%m-%Y")) +
theme(axis.text.x=element_text(hjust = 0.5)) +
xlab("Date") + ylab("")
所以我设法制作了一些情节,这让我想到了几个问题:
如何使用 ggplot 将它们组合成一个单独的图形?
注意到我的条形图在第一个月和最后一个月有空白吗?如何删除它(确切地说,如何从 x 轴上删除 11-2014 和 01-2016)?
在我的条形图中,2014 年 1 月没有销售,因此,库存条占用了更大的空间。如何减小其大小以适应图表的其余部分?
如何将 x 轴从使用日期作为数字(即 12-2014)更改为在单词中使用月份-年份(即 2014 年 12 月)。我试过使用
as.yearmon,但这不适用于我的ggplot函数的scale_x_date部分。平均销售率线也存在问题,我可以放心地假设我会使用
geom_hline(),但我不知道如何解决这个问题。
【问题讨论】:
-
回答题主问题,
ggplot中不可能有多个y轴,所以你将无法合并两张图。 -
所以你的意思是因为平均线使用 % 而条形使用离散整数(例如 125、22、551),这是不可能的,因为它们是完全不同的尺度?
-
是的,最好避免双 y 轴,因为它们很容易被滥用来操纵结论,因此
ggplot2故意不提供该选项。不过,我相信使用googleVis是可能的。