Ggplot2 içindeki scatterplot bölgelerinin etrafına düzgün çokgenler nasıl çizilir [kapalı]


32

Bir dağılım grafiğindeki nokta grubunun etrafına düzgün bir çokgen nasıl eklerim? Ggplot2 kullanıyorum ama sonuçları ile hayal kırıklığına uğradım geom_polygon.

Veri kümesi orada , sekmeyle ayrılmış bir metin dosyası olarak var. Aşağıdaki grafik, birçok ülkede sağlık ve işsizliğe yönelik iki tutum ölçüsünü göstermektedir:

yoğunluk2d ile dağılım grafiği

Daha geom_density2daz fantaziye geçmek istiyorum ama ampirik olarak daha doğru geom_polygon. Sıralanmamış verilerdeki sonuç yararsızdır:

görüntü tanımını buraya girin

Min-max yx değerlerinin etrafına kontur yolu gibi davranan 'düzgün' çokgenleri nasıl çizerim? Verileri boşuna sıralamaya çalıştım.

Kod:

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

dNesne ile elde edilir Bu CSV dosyası .

Çözüm:

Sayesinde Wayne , Andy W onların göstericiler için ve diğerleri! Veri, kod ve grafikler GitHub'a gönderildi . Sonuç şöyle görünür:

sonuç


6
Aradığınız terim noktaların dışbükey gövdesidir (veya potansiyel olarak alfa kabuğudur). Bunları hesaplamak için bir R fonksiyonu bulabilir ve daha sonra bunları arsaya katman olarak ekleyebilmelisiniz.
Andy W,

Doğru terminolojiyi gösterdiğiniz için teşekkür ederiz! Ben kullanım başarısız oldular ?chullile ggplot2bugüne kadar. Doğru kodladığımdan emin değilim ve birisinin daha önce yapmış olduğunu umuyorum.
Fr.

R kodunuzu soruya ekler misiniz?
Yuriy Petrovskiy

Unutulmaması gereken bir şey: gösterdiğiniz şey "outliers" olabilen maxima. R paketinin alphahulldışbükey gövdeyi bulmakla aynı işe yaradığına inanıyorum , ancak güven aralıkları gibi bir şey yapmayı denemek için içeriye / dışarıya doğru ayarlamanıza izin veriyor.
Wayne,

@Wayne, bir alfa gövde bir güven aralığı değildir (hayal edilebilecek herhangi bir şekilde). Kısa bir açıklama ve bir alfa kabuğunun ne olduğuna dair bazı referanslar için bu gis.se sorusuna bakın . Belki de iki değişkenli güven hakkındaki düşünceleriniz elipsler, hatta belki çanta lekeleri (aykırı noktaları tanımlamak için iki değişkenli kutular).
Andy

Yanıtlar:


33

Bazı googling ile Gota Morota'nın web sitesine rastladım, bunu zaten web sitesinde yapıyor . Aşağıda verilerinize verilen bu örnek verilmiştir.

görüntü tanımını buraya girin

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

Teşekkürler, buna göre kodu revize edeceğim. Ne yazık ki, resim dosyanız buraya yüklenmiyor gibi görünüyor ancak kod orada.
Fr.

@Fr. , Sorun tam olarak nedir?
Andy W,

@AndyW Ne yazık ki, kod eksik değerleri desteklemiyor ve bunu yapmak için ince bir yol bulamadım.
Fr.

@Fr., Bu gözlemlerin ortadan kaldırılmasının yanı sıra, eksik veri değerlerinin tam olarak nasıl ele alınmasını istiyorsunuz? Herhangi bir makul değerlendirme tekniği, puanların, eksik olmayan gözlemlerin dışbükey gövdelerinin içinde olmasına neden olacaktır .
Andy,

@AndyW Ben fonksiyonu NAöldürmek demek chull. Onu görmezden gelmesini beklerdim, ancak bunu yapmakta başarısız oluyor ve na.omit()çalışmasını sağlamak için kullanabileceğim bir yol bulamadım . Bunun mümkün olduğuna eminim, sadece önceki çözümün ötesine geçmek için korsanlık becerim yok.
Fr.

8

Sorununu anlamak, dışbükey gövde aradığınız healthve unemployment. Bunu yapmak için, muhtemelen biri paket olan R'de birkaç paket vardır geometry. Noktaların çevreye göre sıralandığını hayal ediyorum ama bunu kontrol etmeniz gerekecek.

EDIT: İşte kullanmayan bir örnek ggplot, ama umarım faydalıdır. chullBelgelerdeki örnek yanlış görünüyor, bu da sizi atıyor olabilir:

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 EDIT: Tamam, işte ggplot2 kullanarak bir şey. Biz çevirmek Xbir içine data.framedeğişkenlerle xve y. Sonra:

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

O Not geom_pointverilerini (kullanıyor Xben bunu geçersiz kılma yerken, ggplot itibaren) ve aes geom_polygon.

Tam olarak elde etmek için, her iki sayının da gövdesine göre x ve y değerlerini koymanız ve bunları ayırt etmek bariçin üçüncü bir sütun issuekullanmanız gerekir.


Dışbükey gövde hakkında düzeltin. chullDışbükey gövde üretmek için kullanmaya çalıştım ancak sonuçları kullanamadım ggplot2.
Fr.

@Fr .: Cevabımı hızlıca değiştirdim. Bakalım bu seni doğru yola sokuyor mu?
Wayne

Nasıl kendi kendine çalıştığını görebiliyorum ama bu son çizgiyi nasıl elde edeceğimi merak ediyorum ggplot2.
Fr.

@Fr .: Tamam, peki ya şimdi?
Wayne,

İşe yaradı! Teşekkürler. Çalışmayı na.omitbırakan NA'dan kurtulmayı eklemek zorunda kaldım chull. Tekrar teşekkürler.
Fr.

5

Bu öğleden sonra, chullişlevi bir R paketinin içine işlev olarak geom_convexhullsardım.

Paket yüklendikten sonra, başka bir coğrafya olarak kullanılabilir, sizin durumunuzda şöyle bir şey olmalı:

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

Paket github'da mevcuttur: https://github.com/cmartin/ggConvexHull


Bunun için çok teşekkürler! Bunu chullbulana kadar bir gruplandırma faktörü üzerinde uygulamaya çalışırken istenmeyen çıktılardan hüsrana uğradım .
Jogall
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.