web-dev-qa-db-ja.com

ggplotの変数をループする

Ggplotを使用して複数の列をループし、複数のプロットを作成したいのですが、forループでプレースホルダーを使用すると、ggplotの動作が変わります。

私がこれを持っている場合:

t <- data.frame(w = c(1, 2, 3, 4), x = c(23,45,23, 34), 
y = c(23,34,54, 23), z = c(23,12,54, 32))

これは正常に機能します。

ggplot(data=t, aes(w, x)) + geom_line()

しかし、これはしません:

i <- 'x'
ggplot(data=t, aes(w, i)) + geom_line()

最終的にx、y、zをループしたい場合、これは問題です。何か助けはありますか?

32
Tom

次のように、aesの代わりにaes_stringを使用する必要があります。

ggplot(data=t, aes_string(x = "w", y = i)) + geom_line() 

その場合、wも文字列として指定する必要があることに注意してください。

37
Matt Parker

問題は、データフレームtにアクセスする方法です。ご存知かもしれませんが、これを行うにはいくつかの方法がありますが、残念ながら、文字を使用することはggplotのそれらの1つではないことは明らかです。

うまくいく1つの方法は、例の列の数値位置を使用することです。たとえば、i <- 2を試すことができます。ただし、これが機能する場合は、私が使用したことのないggplotに基づいています(ただし、Hadleyによる他の作業は知っているので、機能するはずです)

これを回避する別の方法は、ggplotを呼び出すたびに新しい一時データフレームを作成することです。例えば。:

tmp <- data.frame(a = t[['w']], b = t[[i]])
ggplot(data=tmp, aes(a, b)) + geom_line()
2
Henrik

何をしようとしているのかに応じて、facet_wrapまたはfacet_gridは、同じ基本構造で複数のプロットを作成するのに適しています。このような何かがあなたを正しい球場に連れて行くはずです:

t.m = melt(t, id="w")
ggplot(t.m, aes(w, value)) + facet_wrap(~ variable) + geom_line()
0
Dan M.