非常に初心者向けの質問ですが、次のようなデータがあるとします。
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
を付けて、同じグラフにvar1
とggplot2
の両方の時系列をプロットするにはどうすればよいですか。あなたがvar0
とvar1
を異なる色にするならばボーナスポイント、そして凡例を含めることができます!
これは非常に単純なことだと思いますが、例は見当たりません。
変数の数が少ない場合は、手動でプロットを作成できます。
ggplot(test_data, aes(date)) +
geom_line(aes(y = var0, colour = "var0")) +
geom_line(aes(y = var1, colour = "var1"))
一般的な方法は、データを長い形式(パッケージreshape
またはreshape2
の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では、データを "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()
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
あなたのデータを使う:
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()
とreshape
とreshape2
は、もっと複雑な実際のデータセットを操作する場合に便利です。
データがこの積み重ね形式になると、必要なプロットを生成するための単純なggplot()
呼び出しだけが必要になります(lattice
やggplot2
のような高レベルのプロットパッケージが非常に便利な理由の1つ)。
require(ggplot2)
p <- ggplot(stacked, aes(Dates, value, colour = variable))
p + geom_line()
軸のラベル、凡例のタイトルなどを整理するためにあなたに任せます。
HTH
私は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')
しかし、私はこのフォーマットを使って正しい凡例を追加することができませんでした。誰もが知っていますか?