使用ggplot2在同一个图上绘制两个variables作为行

一个非常新鲜的问题,但说我有这样的数据:

test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) ) 

如何在同一图表上绘制时间序列var0var1 ,并在x轴上使用ggplot2 ? 如果您使var0var1不同的颜色,并可以包括一个图例奖金点!

我确信这很简单,但我找不到任何例子。

对于less数variables,您可以使用自己手动构build图表:

 ggplot(test_data, aes(date)) + geom_line(aes(y = var0, colour = "var0")) + geom_line(aes(y = var1, colour = "var1")) 

一般的做法是将数据转换为长格式(使用来自软件包reshapereshape melt() )或从tidyr包中gather()

 library("reshape2") library("ggplot2") test_data_long <- melt(test_data, id="date") # convert to long format ggplot(data=test_data_long, aes(x=date, y=value, colour=variable)) + geom_line() 

ggplot2输出

使用你的数据:

 test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), Dates = seq.Date(as.Date("2002-01-01"), by="1 month", length.out=100)) 

我创build了一个ggplot()想要使用的堆栈版本:

 stacked <- with(test_data, data.frame(value = c(var0, var1), variable = factor(rep(c("Var0","Var1"), each = NROW(test_data))), Dates = rep(Dates, 2))) 

在这种情况下,生成stacked是相当容易的,因为我们只需要做几个操作,但是如果您有一个更复杂的真实数据集来操作,则reshape()reshapereshape reshape2可能会很有用。

一旦数据处于这种堆叠forms,只需要一个简单的ggplot()调用来产生你想要的所有额外的图(这就是为什么像latticeggplot2这样的高级绘图包是如此有用的原因之一):

 require(ggplot2) p <- ggplot(stacked, aes(Dates, value, colour = variable)) p + geom_line() 

我会把它留给你来整理轴标签,传说标题等

HTH

你需要的数据是“高”格式,而不是“宽”ggplot2。 “宽”意味着每行都有一个观察值,每个variables都作为不同的列(就像你现在所做的那样)。 您需要将其转换为“高”格式,其中有一列告诉您variables的名称,另一列告诉您variables的值。 从宽到高的过程通常称为“融化”。 您可以使用tidyr::gather来融化您的数据框架:

 library(ggplot2) library(tidyr) test_data <- data.frame( var0 = 100 + c(0, cumsum(runif(49, -20, 20))), var1 = 150 + c(0, cumsum(runif(49, -10, 10))), date = seq(as.Date("2002-01-01"), by="1 month", length.out=100) ) test_data %>% gather(key,value, var0, var1) %>% ggplot(aes(x=date, y=value, colour=key)) + geom_line() 

多个系列ggplot2

只是为了清楚ggplot通过gatherpipe道后消耗的data如下所示:

 date key value 2002-01-01 var0 100.00000 2002-02-01 var0 115.16388 ... 2007-11-01 var1 114.86302 2007-12-01 var1 119.30996