使用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) )
如何在同一图表上绘制时间序列var0
和var1
,并在x轴上使用ggplot2
? 如果您使var0
和var1
不同的颜色,并可以包括一个图例奖金点!
我确信这很简单,但我找不到任何例子。
对于less数variables,您可以使用自己手动构build图表:
ggplot(test_data, aes(date)) + geom_line(aes(y = var0, colour = "var0")) + geom_line(aes(y = var1, colour = "var1"))
一般的做法是将数据转换为长格式(使用来自软件包reshape
或reshape
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()
使用你的数据:
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()
和reshape
和reshape
reshape2
可能会很有用。
一旦数据处于这种堆叠forms,只需要一个简单的ggplot()
调用来产生你想要的所有额外的图(这就是为什么像lattice
和ggplot2
这样的高级绘图包是如此有用的原因之一):
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()
只是为了清楚ggplot
通过gather
pipe道后消耗的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