多行时间序列格式不正确

时间:2019-01-15 19:18:29

标签: r ggplot2

我正在尝试使用ggplot2绘制多线时间序列图。我一直遵循我所找到的指示,但似乎没有任何作用。

我已经根据文档尝试过多次尝试。

我正在使用的数据如下:

+----------------+----------+--------+
| purchase_month |   type   | orders |
+----------------+----------+--------+
| 2018-07        | local    |    199 |
| 2018-08        | local    |    231 |
| 2018-09        | local    |    222 |
| 2018-10        | local    |    190 |
| 2018-07        | domestic |   1102 |
| 2018-08        | domestic |    924 |
| 2018-09        | domestic |    999 |
| 2018-10        | domestic |    779 |
+----------------+----------+--------+


ggplot(data = sample_data, aes(x = purchase_month, y = orders)) + 
geom_line(aes(color = type), size = 1) +
scale_color_manual(values = c("#00AFBB", "#E7B800")) +
theme_minimal()

运行代码时,它不起作用。当我运行前两行时,它甚至都没有绘制任何点。它只是建立X和Y轴。

3 个答案:

答案 0 :(得分:2)

棘手的部分是在数据集中有一个列作为日期。我们一起做吧。首先,让我们使用这些数据来解决我们的问题:

sample_data <- structure(list(purchase_month = structure(c(17713, 17744, 17775,
  17805, 17713, 17744, 17775, 17805), class = "Date"), type = structure(c(2L,
  2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("domestic", "local"), class = "factor"), 
  orders = c(199, 231, 222, 190, 1102, 924, 999, 779)), row.names = c(NA, 
  -8L), class = "data.frame")

这是我们将要使用的数据:

sample_data
  purchase_month     type orders
1        2018-07    local    199
2        2018-08    local    231
3        2018-09    local    222
4        2018-10    local    190
5        2018-07 domestic   1102
6        2018-08 domestic    924
7        2018-09 domestic    999
8        2018-10 domestic    779

请注意,purchase_month不是日期。我将其转换为在末尾添加-01的日期,因为R中的每个日期都需要一天。由于您对几个月感兴趣,因此我们可以在这里使用任何一天。然后,我将使用ymd包中的lubridate函数来通知R我们的字符串采用年月日格式:

library(lubridate)
sample_data$purchase_month <- ymd(paste0(sample_data$purchase_month, "-01"))

不是,您只需要使用自己的ggplot2代码即可获得自己的情节:

ggplot(data = sample_data, aes(x = purchase_month, y = orders)) + 
  geom_line(aes(color = type), size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) +
  theme_minimal()

enter image description here

答案 1 :(得分:2)

如果我们将purchase_month列更改为类yearmon,然后指定与X比例相同的值,它将起作用。使用末尾注释中可重复显示的数据:

library(zoo)

sample_data2 <- transform(sample_data, purchase_month = as.yearmon(purchase_month))

ggplot(data = sample_data2, aes(x = purchase_month, y = orders)) + 
  geom_line(aes(color = type), size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) +
  theme_minimal() +
  scale_x_yearmon()

或另一种方法是将其转换为每个类型只有一列的宽格式多变量系列,并使用autoplot.zoo。请注意,通过省略facet = NULL可以产生多面板输出。

library(zoo)

z <- read.zoo(sample_data, index = "purchase_month", split = "type", FUN = as.yearmon)

autoplot(z, geom = "blank", facet = NULL) + 
  geom_line(size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) +
  theme_minimal() +
  scale_x_yearmon()

其中任何一种都会产生:

screenshot

注意

Lines <- "
purchase_month |   type   | orders
2018-07        | local    |    199
2018-08        | local    |    231
2018-09        | local    |    222
2018-10        | local    |    190
2018-07        | domestic |   1102
2018-08        | domestic |    924
2018-09        | domestic |    999
2018-10        | domestic |    779"
sample_data <- read.table(text = Lines, header = TRUE, sep = "|", strip.white = TRUE)

答案 2 :(得分:1)

您的代码有两点错误:

  1. 数据列purchase_month不是类"Date"的对象。
  2. 您需要grouptype数据。

我的意思是

sample_data$purchase_month <- as.Date(paste(sample_data$purchase_month, "01", sep = "-"))

ggplot(data = sample_data, 
       aes(x = purchase_month, y = orders, color = type), group = type) + 
  geom_line(size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) +
  theme_minimal()

enter image description here