ggplot2の散布図領域の周りにきちんとしたポリゴンを描く方法[非公開]


32

散布図上のポイントのグループの周りにきちんとしたポリゴンを追加するにはどうすればよいですか?私はggplot2を使用していますが、の結果には失望していますgeom_polygon

データセットは、タブ区切りテキストファイルとしてそこにあります。以下のグラフは、多くの国における健康と失業に対する態度の2つの指標を示しています。

density2dの散布図

私はgeom_density2dより派手ではないが経験的により正確なものに切り替えたいgeom_polygonです。ソートされていないデータの結果は役に立ちません:

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

min-max yx値の周りの輪郭パスとして動作する「きれいな」ポリゴンを描画するにはどうすればよいですか?データを無用にソートしようとしました。

コード:

print(fig2 <- ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
geom_point() + geom_density2d(alpha=.5) + labs(x = "Efficiency", y = "Mandate"))

dオブジェクトを用いて得られる、このCSVファイル

溶液:

ウェインアンディ・W、その他の彼らのポインターに感謝します!データ、コード、グラフはGitHubに投稿されています。結果は次のようになります。

結果


6
探している用語は、ポイントの凸包(または潜在的にアルファ包)です。これらを計算するR関数を見つけ、それらをレイヤーとしてプロットに追加できるはずです。
アンディW

正しい用語を指摘してくれてありがとう!私が使用するために失敗している?chullggplot2、これまで。私がそれを正しくコーディングしているかどうかはわかりませんが、誰かがすでにそれをしていることを願っています。
神父

Rコードを質問に追加していただけますか?
ユーリーペトロフスキー

注意すべき点が1つあります。表示しているのは最大値で、「外れ値」である可能性があります。Rパッケージalphahullは凸包を見つけるのと同じように機能するが、信頼区間のようなことを試みるために内側/外側に調整できると思う。
ウェイン

@Wayne、アルファハルは信頼区間ではありません(何らかの方法で)。簡単な説明と、アルファハルとは何かについては、このgis.seの質問を参照してください。おそらく、2変量の信頼楕円、またはバグプロット(外れ値を特定するための2変量の箱ひげ図)について考えることでしょう。
アンディW

回答:


33

いくつかのグーグルで、私はすでに彼女のウェブサイトでこれをしている例があるゴタ・モロタのウェブサイトに出会いました。以下は、データに拡張した例です。

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

library(ggplot2)
work <- "E:\\Forum_Post_Stuff\\convex_hull_ggplot2"
setwd(work)

#note you have some missing data
mydata <- read.table(file = "emD71JT5.txt",header = TRUE, fill = TRUE)
nomissing <- na.omit(mydata) #chull function does not work with missing data

#getting the convex hull of each unique point set
df <- nomissing
find_hull <- function(df) df[chull(df$eff, df$man), ]
hulls <- ddply(df, "issue", find_hull)

plot <- ggplot(data = nomissing, aes(x = eff, y = man, colour=issue, fill = issue)) +
geom_point() + 
geom_polygon(data = hulls, alpha = 0.5) +
labs(x = "Efficiency", y = "Mandate")
plot

おかげで、それに応じてコードを修正します。残念ながら、画像ファイルはここにロードされていないようですが、コードはそこにあります。
神父

@Fr。、正確には何が問題ですか?
アンディW

@AndyW残念ながら、コードは欠損値をサポートしていません。そのための調整方法を見つけられませんでした。
神父

@Fr。、これらの観測値を排除する以外に、欠損データ値をどのくらい正確に処理したいですか?妥当な代入手法を使用すると、点が非欠損観測の凸包の内側になります。
アンディW

@AndyW私NAchull関数を殺すことを意味します。私はそれをただ無視することを期待しますが、そうすることに失敗し、それを機能na.omit()させるために使用する方法を見つけませんでした。私はそれが可能であると確信しています、私は以前のソリューションを超えるハッカーのスキルを持っていません。
神父

8

私はあなたの問題を理解していれば、あなたはの凸包を探しているhealthとのunemployment。Rにはこれを行うためのパッケージがおそらくいくつかあり、そのうちの1つはpackage geometryです。ポイントは境界線の周りで順番に並べ替えられると思いますが、それを確認する必要があります。

編集:ここに、を使用しない例がありますがggplot、役に立つことを願っています。chullドキュメントの例は間違っているように思われます。

X <- matrix(rnorm(2000), ncol = 2)
X.chull <- chull (X)
X.chull <- c(X.chull, X.chull[1])
plot (X)
lines (X[X.chull,])

編集2:OK、これはggplot2を使用したものです。私たちは、ターンXdata.frame変数をxy。次に:

library(ggplot2)
X <- as.data.frame(X)
hull <- chull(X)
hull <- c(hull, hull[1])
ggplot(X, aes(x=x, y=y)) + geom_polygon(data=X[hull,], fill="red") + geom_point()

がggplot geom_pointのデータ(X)とaes を使用していることに注意してくださいgeom_polygon

完全に取得するには、両方の問題の船体のxとyをbar3つ目の列issueを使用してに入れる必要があります。


凸包について修正します。私はchull凸包の生成に使用しようとしましたが、結果をに使用できませんでしたggplot2
神父

@Fr .:回答を簡単に編集しました。それがあなたを正しい軌道に乗せるかどうかを確認してください。
ウェイン

私はそれがそれ自体でどのように機能するかを見ることができますが、で最後の行を取得する方法を疑問に思いますggplot2
神父

@Fr .:では、今はどうですか?
ウェイン

出来た!ありがとう。動作na.omitを停止するNAを取り除くために追加する必要がありchullました。再度、感謝します。
神父

5

今日の午後の時点でchull、Rパッケージ内の関数を関数としてラップしましたgeom_convexhull

パッケージがロードされると、他のgeomとして使用できます。あなたの場合は、次のようになります。

ggplot(d, aes(man, eff, colour=issue, fill=issue)) + 
  geom_convexhull(alpha=.5) + 
  geom_point() + 
  labs(x = "Efficiency", y = "Mandate"))

パッケージはgithubで入手できます:https : //github.com/cmartin/ggConvexHull


これに感謝します!chullこれを見つけるまで、グループ化要因に適用しようとすると、望ましくない出力にイライラしていました。
ジョガー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.