Cara menggambar poligon yang rapi di sekitar wilayah scatterplot di ggplot2 [ditutup]

32

Bagaimana cara menambahkan poligon yang rapi di sekitar sekelompok titik di sebar? Saya menggunakan ggplot2 tetapi saya kecewa dengan hasilnya geom_polygon.

Dataset ada di sana , sebagai file teks yang dibatasi tab. Grafik di bawah ini menunjukkan dua ukuran sikap terhadap kesehatan dan pengangguran di banyak negara:

sebar dengan density2d

Saya ingin beralih dari geom_density2dyang kurang mewah tetapi secara empiris lebih benar geom_polygon. Hasil pada data yang tidak disortir tidak membantu:

masukkan deskripsi gambar di sini

Bagaimana cara menggambar poligon 'rapi' yang berperilaku sebagai jalur kontur di sekitar nilai min-max yx? Saya mencoba menyortir data tetapi tidak berhasil.

Kode:

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

The dobjek diperoleh dengan file CSV ini .

Larutan:

Terima kasih kepada Wayne , Andy W dan yang lainnya untuk petunjuk mereka! Data, kode, dan grafik telah diposting ke GitHub . Hasilnya terlihat seperti ini:

hasil

Fr.
sumber
6
Istilah yang mungkin Anda cari adalah cembung poin (atau berpotensi hull alpha). Anda harus dapat menemukan fungsi R untuk menghitung ini dan kemudian dapat menambahkannya sebagai layer ke plot.
Andy W
Terima kasih telah menunjukkan terminologi yang benar! Saya gagal menggunakan ?chulldengan ggplot2sejauh ini. Saya tidak yakin bahwa saya mengkodekannya dengan benar, dan berharap seseorang telah melakukannya.
Fr.
Bisakah Anda menambahkan kode R ke pertanyaan?
Yuriy Petrovskiy
Satu hal yang perlu diperhatikan: apa yang Anda tampilkan adalah maxima, yang mungkin "outlier". Saya percaya paket R alphahullbekerja mirip dengan menemukan lambung cembung, tetapi memungkinkan Anda untuk menyesuaikannya ke dalam / ke luar untuk mencoba melakukan sesuatu seperti interval kepercayaan.
Wayne
@Wayne, alpha hull bukan interval kepercayaan diri (dengan cara apa pun yang bisa dibayangkan). Lihat pertanyaan gis.se ini untuk deskripsi singkat dan beberapa referensi tentang apa itu alpha hull. Mungkin pemikiran Anda tentang elips kepercayaan bivariat, atau mungkin bahkan bagplot (boxplot bi-variate untuk mengidentifikasi outlier).
Andy W

Jawaban:

33

Dengan beberapa googling saya menemukan situs web Gota Morota yang memiliki contoh melakukan hal ini di situs webnya . Di bawah ini adalah contoh yang diperluas ke data Anda.

masukkan deskripsi gambar di sini

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
Andy W
sumber
Terima kasih, saya akan merevisi kode yang sesuai. Sayangnya, file gambar Anda tampaknya tidak dimuat di sini, tetapi kode itu ada di sana.
Fr.
@Fr. , Apa sebenarnya masalahnya?
Andy W
@AndyW Sayangnya, kode tidak mendukung nilai yang hilang, dan saya tidak menemukan cara untuk mengubahnya untuk melakukannya.
Fr.
@Fr., Bagaimana tepatnya Anda ingin nilai data yang hilang ditangani selain menghilangkan pengamatan itu? Setiap teknik imputasi yang masuk akal akan menghasilkan titik-titik yang berada di dalam lambung cembung pengamatan yang tidak hilang.
Andy W
@AndyW Maksud saya NAmembunuh chullfungsi. Saya berharap untuk mengabaikannya saja, tetapi gagal dalam melakukannya dan saya tidak menemukan cara na.omit()untuk membuatnya berfungsi. Saya yakin itu mungkin, saya hanya tidak memiliki keterampilan hackery untuk melampaui solusi sebelumnya.
Fr.
8

Jika saya memahami masalah Anda, Anda mencari lambung cembung dari healthdan unemployment. Mungkin ada beberapa paket untuk melakukan ini di R, salah satunya adalah paket geometry. Saya akan membayangkan bahwa titik-titik diurutkan dalam urutan di sekeliling, tetapi Anda harus memeriksanya.

EDIT: Berikut ini contoh, yang tidak digunakan ggplot, tapi saya harap ini berguna. Contoh dalam chulldokumentasi tampaknya salah, yang mungkin membuat Anda tidak senang:

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

EDIT 2: OK, ini ada sesuatu yang menggunakan ggplot2. Kami berubah Xmenjadi data.framedengan variabel xdan y. Kemudian:

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()

Perhatikan bahwa geom_pointini menggunakan data ( X) dan aes dari ggplot, sementara saya menimpanya di geom_polygon.

Untuk mendapatkannya sepenuhnya, Anda harus memasukkan x dan y untuk lambung untuk kedua masalah bar, menggunakan kolom ketiga issueuntuk membedakannya.

Wayne
sumber
Benar tentang lambung cembung. Saya telah mencoba menggunakan chulluntuk menghasilkan convex hull tetapi gagal menggunakan hasilnya ggplot2.
Fr.
@Fr .: Saya sudah mengedit jawaban saya dengan cepat. Lihat apakah itu menempatkan Anda di jalur yang benar.
Wayne
Saya bisa melihat cara kerjanya sendiri, tetapi saya ingin tahu bagaimana cara mendapatkan baris terakhir itu ggplot2.
Fr.
@ Fr .: OK, bagaimana kalau sekarang?
Wayne
Berhasil! Terima kasih. Saya harus menambahkan na.omituntuk menghilangkan NA yang berhenti chullbekerja. Terima kasih lagi.
Fr.
5

Sampai sore ini, saya telah membungkus chullfungsi di dalam paket R sebagai geom_convexhullfungsi.

Setelah paket dimuat, itu dapat digunakan sebagai geom lainnya, dalam kasus Anda harus sesuatu seperti:

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

Paket ini tersedia di github: https://github.com/cmartin/ggConvexHull

Charles Martin
sumber
Terima kasih banyak untuk ini! Saya menjadi frustrasi dari hasil yang tidak diinginkan ketika mencoba menerapkan chullfaktor pengelompokan sampai saya menemukan ini.
jogall