2010-09-23 170 views
203

一個非常newbish問題的線條,但說我有這樣的數據:繪製兩個變量的使用GGPLOT2在同一張圖

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,與使用ggplot2在x軸上使用date?如果您製作var0var1不同的顏色,並且可以包含圖例,則可獲得獎勵積分!

我確定這很簡單,但我找不到任何示例。

回答

259

對於少數的變量,因此可以採用手工打造的情節自己:

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

很好的例子,但是如何定製我自己的顏色例如黑色和橙色)?,因爲它似乎是使用'color ='作爲變量名稱。 – 2015-10-27 14:23:05

+8

使用比例.... – hadley 2015-10-28 01:56:37

+3

'+ scale_colour_manual(values = c(「black」,「orange」))'' – 2017-09-18 18:16:24

12

使用您的數據:

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)) 

我建立堆疊的版本,這是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()reshapereshape2可能會很有用。

一旦數據在此堆放形式,只需要一個簡單的ggplot()調用產生你所有的演員想要的情節(原因之一,更高級別的繪圖包,比如latticeggplot2是如此有用):

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

我要把它留給你收拾軸標籤,圖例標題等

HTH

+1

我想你在你的代碼中有一個錯位的parens。我認爲這就是你以後的樣子:堆棧< - with(test_data,data.frame(value = c(var0,var1),variable = factor(rep(c(「Var0」,「Var1」))),each = NROW(test_data),Dates = rep(date,2)))。另外,「每個」列的目的是什麼?這不僅僅是一種更復雜且效率更低的融合數據的方式,如rcs所示?我想我可以想象一個融化不會完成工作的例子,但它幾乎肯定是這項工作的正確工具,除非我失去了一些東西? – Chase 2010-09-23 12:56:01

+1

@chase,對不起,那是Emacs ESS得到錯誤的縮進。每個都是'rep()'的參數,所以我們真的只能在堆疊中得到3個col。我將編輯代碼以使縮進更清晰。 – 2010-09-23 16:28:53

+1

@chase;你的關於'melt()'的評論很好用,我注意到reshape [2]包在這裏很有用。我對reshape2並不熟悉,而且手動操作這種簡單的操作比調用'melt()'更復雜,因爲我不需要閱讀如何使用'melt() '。在我製作我的作品時,rcs潛入了他的答案;當我開始答覆時,沒有任何答案。正如他們所說的,不止一種方法可以讓貓變皮! ;-) – 2010-09-23 16:33:11

272

的一般方法是將數據轉換爲長格式(使用melt()從包reshapereshape2)或gather()tidyr包:

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 output

+4

你也可以使用'tidyr'包的'gather()'函數來融合數據:'gather(test_data,variable,value,-date)' – janosdivenyi 2015-12-09 10:13:12

12

您需要將數據設置爲「高」格式,而不是「ggplot2」的「寬」格式。 「寬」意味着每行都有一個觀察值,每個變量作爲不同的列(就像你現在所做的那樣)。您需要將其轉換爲「高」格式,其中有一列告訴您變量的名稱,另一列告訴您變量的值。從寬到高的過程通常稱爲「融化」。您可以使用tidyr::gather融化你的數據幀:通過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() 

multiple series ggplot2

只是要清楚的dataggplot被消耗看起來是這樣的:

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 
相關問題