web-dev-qa-db-ja.com

同じグラフ上でggplot2を使って2つの変数を線としてプロットする

非常に初心者向けの質問ですが、次のようなデータがあるとします。

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を使用して、x軸にdateを付けて、同じグラフにvar1ggplot2の両方の時系列をプロットするにはどうすればよいですか。あなたがvar0var1を異なる色にするならばボーナスポイント、そして凡例を含めることができます!

これは非常に単純なことだと思いますが、例は見当たりません。

268
fmark

変数の数が少ない場合は、手動でプロットを作成できます。

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

一般的な方法は、データを長い形式(パッケージreshapeまたはreshape2melt()を使用)または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 output

330
rcs

Ggplot2では、データを "wide"ではなく "tall"形式にする必要があります。 「広い」とは、各変数を異なる列として1行ごとに観測を行うことを意味します(今のように)。変数の名前を示す列と変数の値を示す列がある場合は、それを "背の高い"形式に変換する必要があります。幅の広いものから高いものへと進む過程は、通常「融解」と呼ばれます。 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()

multiple series ggplot2

dataを介してパイプ処理した後にggplotが消費しているgatherを明確にするためには、次のようになります。

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
29
ecerulm

あなたのデータを使う:

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の生成は2、3回の操作で済み、非常に簡単でしたが、reshape()reshapereshape2は、もっと複雑な実際のデータセットを操作する場合に便利です。

データがこの積み重ね形式になると、必要なプロットを生成するための単純なggplot()呼び出しだけが必要になります(latticeggplot2のような高レベルのプロットパッケージが非常に便利な理由の1つ)。

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

軸のラベル、凡例のタイトルなどを整理するためにあなたに任せます。

HTH

12
Gavin Simpson

私はRにも慣れていませんが、ggplotがどのように機能するかを理解しようとすると、別の方法が使えると思います。私はおそらく完全に完璧な解決策としてではなく、いくつかの異なる観点を追加することを共有します。

私はggplotがデータフレームをより良く扱うように作られていることを知っていますが、データフレームを使わずに2つのベクトルを直接プロットできることを知っておくと役に立つこともあります。

データのロード。元の日付ベクトルの長さは100ですが、var0とvar1の長さは50なので、使用可能なデータ(最初の50の日付)だけをプロットします。

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

プロット

ggplot() + geom_line(aes(x=date,y=var0),color='red') + 
           geom_line(aes(x=date,y=var1),color='blue') + 
           ylab('Values')+xlab('date')

enter image description here

しかし、私はこのフォーマットを使って正しい凡例を追加することができませんでした。誰もが知っていますか?

4
Papalagui