web-dev-qa-db-ja.com

サブセットとggplot2

Ggplot2でデータフレームのサブセットをプロットするのに問題があります。私のdfは次のようなものです:

ID Value1 Value2
P1 100 12
P1 120 13
...
P2 300 11
P2 400 16
...
P3 130 15
P3 140 12
...

ID P1とP3についてのみValue1対Value2をプロットするにはどうすればよいですか?たとえば、私が試した:

ggplot(subset(df,ID=="P1 & P3") + geom_line(aes(Value1, Value2, group=ID, colour=ID)))

しかし、常にエラーが表示されます。

追伸また、P1とP3との多くの組み合わせを試しましたが、常に失敗しました。

52
matteo

サブセット化の2つのオプション:

ベースRからsubsetを使用:

library(ggplot2)
ggplot(subset(dat,ID %in% c("P1" , "P3"))) + 
         geom_line(aes(Value1, Value2, group=ID, colour=ID))

subsetの引数geom_lineの使用(注意:plyrパッケージを使用して、特別な.関数を使用しています)。

library(plyr)
ggplot(data=dat)+ 
  geom_line(aes(Value1, Value2, group=ID, colour=ID),
                ,subset = .(ID %in% c("P1" , "P3")))

補完的なサブセットを使用することもできます:

subset(dat,ID != "P2")
62
agstudy

特に同じオブジェクトの複数のサブセットをプロットする場合、特に便利な別のソリューションがあります。

myplot<-ggplot(df)+geom_line(aes(Value1, Value2, group=ID, colour=ID))
myplot %+% subset(df, ID %in% c("P1","P3"))
myplot %+% subset(df, ID %in% c("P2"))
15
Nick Isaac

@agstudyの答えはggplot2の最新バージョンではうまくいきませんでしたが、maggritrパイプを使用するとうまくいきました。

ggplot(data=dat)+ 
  geom_line(aes(Value1, Value2, group=ID, colour=ID),
                data = . %>% filter(ID %in% c("P1" , "P3")))

geom_linedataが関数であると認識すると、継承されたバージョンのdataでその関数を呼び出し、その関数の出力をdataとして使用するため、動作します。

7
nicolaskruchten

次のプロットを探していますか?

library(ggplot2) 
l<-df[df$ID %in% c("P1","P3"),]
myplot<-ggplot(l)+geom_line(aes(Value1, Value2, group=ID, colour=ID))

enter image description here

7
Metrics

@agstudyの回答のオプション2が非推奨になったため、関数を使用してデータを定義すると便利です。

library(plyr)
ggplot(data=dat) + 
  geom_line(aes(Value1, Value2, group=ID, colour=ID),
            data=function(x){x$ID %in% c("P1", "P3"))

このアプローチは、同じプロットでデータセットを再利用する場合に便利です。 data.frameで新しい列を指定したくない場合、またはレイヤーのデータセットを他のデータセットの上に明示的にプロットしたい場合:

library(plyr)
ggplot(data=dat, aes(Value1, Value2, group=ID, colour=ID)) + 
  geom_line(data=function(x){x[!x$ID %in% c("P1", "P3"), ]}, alpha=0.5) +
  geom_line(data=function(x){x[x$ID %in% c("P1", "P3"), ]})
6
Dave

処方はほぼ正しいです。あなたが欲しい:

subset(dat, ID=="P1" | ID=="P3") 

|(「パイプ」)は「または」を意味します。ソリューションID=="P1 & P3"は、IDが文字通り"P1 & P3"であるケースを探しています

3
Drew Steen

P1およびP3の行のみをサブセット化するフィルターを試してください

df2 <- filter(df, ID == "P1" | ID == "P3")

よりもValue1をプロットできます。 vs Value2。

2
CSV

Ggplot内でサブセットを使用

ggplot(data = subset(df, ID == "P1" | ID == "P2") + aes(Value1, Value2, group=ID, colour=ID) + geom_line()

0
hizjamali