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


305

非常に新しい質問ですが、次のようなデータがあると言います。

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

を使用して、x軸に時系列var0var1同じグラフの両方をプロットするにはどうすればよいですか?色違いで作るとボーナスポイント、伝説を含めることができます!dateggplot2var0var1

これは非常にシンプルだと思いますが、そこに例を見つけることはできません。

回答:


373

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

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

3
良い例ですが、自分の色(黒とオレンジなど)をカスタマイズする方法は?colour=変数名として使用しているようです。
Darwin PC

1
でもcolour='var_names'ハドレー作品の罰金で指定されたとして。しかし、@ DaveX-関数によって自動的に選択された色ではなく、特定の色を選択したい場合は、より具体的になります。
I_m_LeMarque

それに凡例を追加するにはどうすればよいですか?
user1700890

361

一般的なアプローチは、データを長い形式(melt()パッケージreshapeまたはを使用reshape2)またはgather()/ pivot_longer()からパッケージに変換することです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の出力

ワイドからロングへのデータの再形成に関するこの質問も参照してください。


8
また、使用することができますgather()の機能tidyr:データを溶融するために、パッケージをgather(test_data, variable, value, -date)
janosdivenyi

33

ggplot2のデータは、「ワイド」ではなく「トール」形式である必要があります。「広い」とは、各変数を別の列として行ごとに観測することを意味します(現在のように)。変数の名前を通知する列と変数の値を通知する別の列がある「高い」形式に変換する必要があります。幅の広いものから背の高いものへと移行するプロセスは、通常「溶融」と呼ばれます。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

明確にするためにdataggplotそれを経由し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

13

データの使用:

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


1
私はあなたがそこにあなたのコードで見当違いの括弧を持っていると思います。私はこれがあなたが望んでいることだと思います:スタック<-with(test_data、data.frame(value = c(var0、var1)、variable = factor(rep(c( "Var0"、 "Var1")))、each = NROW(test_data)、日付= rep(date、2)))。また、列「それぞれ」の目的は何ですか?そして、これはrcsで示されるようにデータを溶融するためのより複雑で効率の悪い方法ではありませんか?メルトが仕事を終わらせない例を想像することができると思いますが、私が何かを見逃していない限り、それはほぼ間違いなくこの仕事に適切なツールですか?
追跡

1
@chase、申し訳ありませんが、Emacs ESSはインデントを間違えています。それぞれがの引数であるためrep()、実際にはで3つのcolしか取得していませんstacked。インデントをわかりやすくするためにコードを編集します。
Gavin Simpson

1
@追跡; あなたのコメントmelt()はよく受け取られており、reshape [2]パッケージがここで役立つと思います。私はreshape2にあまり詳しくありません。そのような単純な操作を手動で行うと、を呼び出すよりも複雑になりmelt()ますmelt()。使用方法を読む必要がなかったので、労力は少なくなりました。そして、私が私のものを生産している間、rcsは彼の答えを忍び込みました。私が返信を始めたとき、答えはありませんでした。猫の皮をむく方法は複数あります-彼らが言うように!;-)
Gavin Simpson、

7

私は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')

ここに画像の説明を入力してください

ただし、この形式を使用して正しい凡例を追加することはできませんでした。誰か知っていますか?


1
これは伝説を追加します ggplot() + geom_line(aes(x=date,y=var0, group=1, colour = 'red')) + geom_line(aes(x=date,y=var1, group = 2, colour = 'blue')) + ylab('Values')+xlab('date')
フルビウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.