2012-07-13 23 views
5

私はggplot2の1つの「クラス」の一部として複数の行をプロットしようとしています。ggplot:1つの色/クラスの複数行

image with 5 classes

しかし、私の問題は、私は(伝説では、単一の名前のそれぞれについて、グレーの細い線)N1、N2、および単一のクラスとしてN3を表示したいということです:私は、次のようなものをプロットすることができます。

私の問題は、それらをグループ化するためにデータフレームに新しい要素を作成すると、最後にn1(右上)の終わりからn2(左下)の始めまで追加接続を描画することです。私のグラフ全体に対角線を追加します。

graph with one class

私が欲しいものに近いのですが、追加の対角線を持っていること。重要な場合は、ROCRを使用してこれらを計算し、結果のperformanceオブジェクトからxとy点を抽出して、これらの線を生成します。

+1

最小限の再現可能な例(データ+コード)を入力すれば、これははるかに簡単に答えることができます。 – joran

+0

私は同意します。残念ながら、このような例を再現するために必要なコードが実際の質問よりも多くのスペースを占めるのではないかと心配しました。私の希望は、誰かがこの理論を認識し、以前にその問題の解決策を見ているかもしれないということです。 –

+1

私は再現可能な例はありませんが、2番目のプロットでは、最初のプロットと同じ変数を使用して、グループの審美性と色の新しい要素を指定することができます。 – baptiste

答えて

1

は、ここに1つの方法ですが、私はあなたがそれを非常に気に入るだろうとは思わない:あなたのソリューションは、他の種類のデータとうまく動作しません

d1 <- data.frame(x = 1:10, 
       y = rep(1:2,each = 5), 
       grp = factor(rep(letters[1:2],each = 5),levels = letters[1:3])) 
d1 <- rbind(d1,data.frame(x = 1:2,y = c(NA,NA),grp = c('c','c'))) 

d2 <- data.frame(x = 1:15, 
       y = rep(3:5,each = 5), 
       grp = rep(1:3,each = 5)) 

ggplot() + 
    geom_line(data = d1,aes(x = x,y = y,group = grp,colour = grp)) + 
    geom_line(data = d2,aes(x = x,y = y,group = grp),colour = "blue") 

enter image description here

注意。凡例の同じカテゴリにマージしたい3つの行のそれぞれが、基本的に同じ場所で始まり、終わりになることが起こります。そうでない場合は、不要なコネクタラインで終わるでしょう。

上記の方法はより一般的に機能しますが、わかりますようにそれほど厄介ではありません。何かあれば、より不便です。

このような問題は何度も起こりました。私は単純な解決策を忘れている可能性があります。しかし、一般的には、ggplot2の代わりに、手動ですべての凡例を作成する必要がないことを覚えておいてください。(いつもとは限りませんが)基本グラフィックに比べて柔軟性を犠牲にしています。

+0

ありがとう!私のソリューションが普遍的に採用されるべきではないことを最初に告白するだろう。これは良い解決策です--ggplot2のレイヤーについて新しいことを教えてもらえますが、それは理想的ではないことに同意します。私はおそらくこのシナリオでは 'lines'を使ったほうが良いでしょうが、ggplot2を使ってグラフィックスの残りの部分をフォーマットしていたので、ここでは利便性よりも一貫性を持たせます。再度、感謝します。 –

0

私はこのグラフをプロットしようとしたときに、ROCR performanceオブジェクトの項目をdata.frameに直接持っていました。ミドルクラスのデータの順序を逆にすることで、右上から左下に移動することができることを理解しています。すなわち

n1 <- getPerformance(test1) 
n2 <- getPerformance(test2) 
n3 <- getPerformance(test3) 

は、ここでの問題は、(私はn2にN1をrbindとき、私はN2のポイントにN1のポイント(1,1)を接続するだろうということである

type x   y 
1 n1 0 0.000000000 
2 n1 0 0.003448276 
3 n1 0 0.006896552 
4 n1 0 0.010344828 
5 n1 0 0.013793103 
6 n1 0 0.017241379 
... 
26565 n1 0.9999619 1 
26566 n1 1.0000000 1 

のように見える3つのデータフレームを作成します0,0) - 対角線を作成します。

私の場合、1つの(ややこしい)解決策は、対角線がないように、他の行の順番を単に逆転させることでした。

n2_rev <- n2[nrow(n2):1,] 
ns <- rbind(n1,n2_rev,n3) 

は、だから今のラインが前後行く代わりに始まり、一貫して同じ位置で終わる、次のグラフの作成:それでも

desired graph

を、私はより普遍的ながありますと仮定しますこれを処理する方法。基底Rのための関数lines()のようなggplot2グラフに行を追加する良い方法はありますか?

関連する問題