ggplot:按月计算多年

时间:2016-12-18 06:59:43

标签: r plot ggplot2

所以,我碰到了一些我认为不会遇到的东西。我搜索谷歌寻找答案,但还没找到任何东西(还)......

我有两个数据集 - 一个用于2015年,一个用于2016年。它们代表IT系统的可用性。数据框如下:

2015年数据集:

variable value
Jan 2015 100
Feb 2015 99.95
...      ...

2015年数据集:

variable value
Jan 2016 99.99
Feb 2016 99.90
...      ...

他们只是从1月到12月列出了系统的可用性。 “变量”列是as.yearmon数据类型,值是简单数字。

我想创建一个带有ggplot2的geom_line()图表,它基本上将百分比作为y轴,将月份作为x轴。我已经能够做到这一点,有两条线,但x轴从2015年1月到2016年12月。我想要的是让它们只按月绘制,所以它们重叠。我已经用尺度等尝试了各种各样的东西,但我还没弄清楚如何做到这一点。

基本上,我需要按照时间顺序读取1月到12月的x轴,但我想在同一张图表上绘制2015年和2016年。这是我现在的ggplot代码(非工作):

ggplot(data2015,aes(variable,value)) +
geom_line(aes(color="2015")) +
geom_line(data=data2016,aes(color="2016")) +
scale_x_yearmon() +
theme_classic()

当我处理yearmon()数据类型时,这将在连续流中绘制。我尝试过这样的事情:

ggplot(data2015,aes(months(variable),value)) +
geom_line(aes(color="2015")) +
geom_line(data=data2016,aes(color="2016")) +
theme_classic()

显然这不起作用。我认为months()可能仍然以某种方式携带这一年。如果我将它们绘制为factors(),则它们不合适。任何帮助将非常感谢。提前谢谢!

3 个答案:

答案 0 :(得分:12)

要获得每年的单独行,您需要从每个日期中提取年份并将其映射为颜色。要在x轴上获得月份(没有年份),您需要从每个日期中提取月份并映射到x轴。

library(zoo)
library(lubridate)
library(ggplot2)

让我们创建一些日期为as.yearmon格式的虚假数据。我将创建两个独立的数据框,以便与您在问题中描述的内容相匹配:

# Fake data
set.seed(49)
dat1 = data.frame(date = seq(as.Date("2015-01-15"), as.Date("2015-12-15"), "1 month"),
                 value = cumsum(rnorm(12)))
dat1$date = as.yearmon(dat1$date)

dat2 = data.frame(date = seq(as.Date("2016-01-15"), as.Date("2016-12-15"), "1 month"),
                  value = cumsum(rnorm(12)))
dat2$date = as.yearmon(dat2$date)

现在为情节。我们将分别从date包中yearmonth函数中提取lubridate年份和年份。我们还将年份变成一个因素,因此ggplot将使用年份的分类调色板,而不是连续的颜色渐变:

ggplot(rbind(dat1,dat2), aes(month(date, label=TRUE, abbr=TRUE), 
                value, group=factor(year(date)), colour=factor(year(date)))) +
  geom_line() +
  geom_point() +
  labs(x="Month", colour="Year") +
  theme_classic()

enter image description here

答案 1 :(得分:1)

month value year
Jan 99.99 2015
Feb 99.90 2015
Jan 100 2016
Feb 99.95 2016

您需要一个具有年份列的longform数据集。然后,您可以使用ggplot

绘制两条线

ggplot(dataset, aes(x = month, y = value, color = year)) + geom_line()

答案 2 :(得分:1)

ggseasonplot包中的

forecast可以为您做到这一点。带有ts对象的示例代码:

ggseasonplot(a10, year.labels=TRUE, year.labels.left=TRUE) +
  ylab("$ million") +
  ggtitle("Seasonal plot: antidiabetic drug sales")

enter image description here

Source