2015-11-29 20 views
5

ggplotを特定の順序でプロットして、オブジェクトが重なったときに表示されるものを制御します。各データ行は、2つのジオメトリレイヤーのコンポジットにマップされます。プロットの詳細には、これが必要です。私はこれを行うためにループを使用してきましたが、それは非常に遅いです。もっと良い方法があるのだろうか?例えばggplot2で複数のジオメトリを持つビジュアルオブジェクトのプロット順序を制御する

d = data.frame(x=c(1,5,2,2,4,2), y=c(1,1,4,3,3,5), grp=c(1,1,1,2,2,2)) 

ggplot(d, aes(x, y, group=grp)) + 
    geom_polygon(aes(fill = factor(grp))) + 
    geom_line(size=1) 

enter image description here

各ポリゴンの線は、そのポリゴンでプロットしなければならない - そう例えば赤いポリゴンの線は青のポリゴンによって隠されるべきです。 geom_polygongeom_lineの両方が同じデータセットを使用しているときに、ループなしでこれを達成する方法はありますか?


編集:ルーピング方法..ここ

は、私が使用したループメソッドです。パフォーマンスを比較するためのより良いデータセットを追加しました。どちらも私のマシンで約5.6秒かかる。比較すると、典型的なアプローチ(ggplot(d, aes(x, y, fill=factor(grp))) + geom_polygon() + geom_line(size=1))は0.45秒かかる。

d = data.frame(x = sample(-30:30,99,rep=T) + rep(sample(1:100,33),each=3), 
       y = sample(-30:30,99,rep=T) + rep(sample(1:100,33),each=3), 
       grp = rep(1:33,each=3)) 

# Method 1 - for loop 
p = ggplot() 
for(g in unique(d$grp)){ 
    dat = subset(d, grp == g) 
    p = p + geom_polygon(data=dat, aes(x, y, fill = factor(grp))) + 
    geom_line(data=dat, aes(x, y), size=1) 
} 
print(p) 

# Method 2 - apply 
ggplot() + lapply(unique(d$grp), FUN=function(g){ 
    dat = subset(d, grp == g) 
    list(geom_polygon(data=dat, aes(x, y, fill = factor(grp))), 
     geom_line(data=dat, aes(x, y), size=1)) 
}) 

enter image description here

+0

あなたが直面している問題は、ラインと関係していると思います。 geom_line()を削除すると、目的の結果が得られます。また、geom_polygon()の前にgeom_lineを置くと、あなたが望む出力が得られるとわかります –

+1

あなたが使っていたfor-loopを表示できますか? – Heroka

+0

@geotheory申し訳ありませんが解決策はありません。私が持っている唯一のアイデアは、あなたがラインを必要としていたときに、両側で少し大きめのグループごとに余分なポリゴンを作成し、それらを最初に黒でプロットし、次にカラーで上書きすることです。しかし、私はこれがあなたのイメージを生成するためにループを実行するのに要するよりもプログラム/テストに時間がかかると思う。 – Heroka

答えて

1

私はちょうどあなたのコードを使用し、それはこの

d = data.frame(x=c(1,5,2,2,4,2), y=c(1,1,4,3,3,5), grp=c(1,1,1,2,2,2)) 

ggplot(d, aes(x, y, group=grp)) + 
    geom_line(size=1)+ 
    geom_polygon(aes(fill = factor(grp))) 

のように見え、結果はこの1つ

enter image description here

ある ggplot2 にレイヤーの順序を変更

geom_line呼び出しを削除すると、同じ結果が得られますが、境界線は生成されません。

+0

本当に役に立たないマリアンは申し訳ありません。すべてのポリゴンの前(すべてのポリゴンの下)にすべての線をプロットするだけです。青緑色のポリゴンがラインの一部をどのように失ったかを見てください。 – geotheory

+0

私は理解します。私が今考えている限り、私はその行を削除することを提案しています(元の例では三角形の境界になっていません)。私は後でそれをもう一度考えます。私はgeom_lineがそれを行うための最良の方法ではないかもしれないと思っています...多分geom_segment –

+0

はいラインは単なるデモの例です。視覚化には2つの別々のジオメトリが必要です。 – geotheory

関連する問題