วิธีการวาดรูปหลายเหลี่ยมเรียบร้อยรอบ ๆ ภูมิภาคกระจายใน ggplot2 [ปิด]


32

ฉันจะเพิ่มรูปหลายเหลี่ยมที่เรียบร้อยรอบ ๆ กลุ่มของจุดบนแผนการกระจายได้อย่างไร ฉันใช้ ggplot2 geom_polygonแต่กำลังผิดหวังกับผลของการ

ชุดข้อมูลอยู่ที่นั่นเป็นไฟล์ข้อความที่คั่นด้วยแท็บ กราฟด้านล่างแสดงให้เห็นถึงสองมาตรการของทัศนคติต่อสุขภาพและการว่างงานในหลายประเทศ:

กระจายกับความหนาแน่น 2D

ฉันต้องการที่จะเปลี่ยนจาก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 นี้

วิธีการแก้:

ขอบคุณWayne , Andy Wและคนอื่น ๆ ที่เป็นตัวชี้! ข้อมูลรหัสและกราฟได้รับการโพสต์ไป GitHub ผลลัพธ์จะเป็นดังนี้:

ผล


6
คำที่คุณอาจกำลังมองหาคือตัวเรือนูนของจุด (หรืออาจเป็นตัวเรืออัลฟา) คุณควรจะสามารถหาฟังก์ชั่น R เพื่อคำนวณเหล่านี้และจากนั้นสามารถเพิ่มพวกมันเป็นเลเยอร์ในพล็อต
Andy W

ขอบคุณสำหรับการชี้ให้เห็นคำศัพท์ที่ถูกต้อง! ฉันได้ล้มเหลวในการใช้งาน?chullด้วยggplot2เพื่อให้ห่างไกล ฉันไม่แน่ใจว่าฉันเขียนโค้ดถูกต้องและหวังว่าจะมีคนทำมันแล้ว
คุณพ่อ

คุณสามารถเพิ่มรหัส R ของคุณให้เป็นคำถามได้หรือไม่
Yuriy Petrovskiy

สิ่งหนึ่งที่ควรทราบ: สิ่งที่คุณกำลังแสดงคือสูงสุดซึ่งอาจเป็น "ค่าผิดปกติ" ฉันเชื่อว่าแพ็คเกจ R alphahullทำงานคล้ายกับการค้นหาตัวเรือนูน แต่อนุญาตให้คุณปรับเข้าด้านใน / ด้านนอกเพื่อพยายามทำบางสิ่งบางอย่างเช่นช่วงความมั่นใจ
เวย์น

@Wayne ตัวเรือไม่ใช่ช่วงความมั่นใจ (เท่าที่จะเป็นไปได้) ดูคำถาม gis.se นี้สำหรับคำอธิบายสั้น ๆ และการอ้างอิงบางอย่างของตัวเรือคืออะไร บางทีคุณอาจนึกถึงความเชื่อมั่นในแวดวง bivariate หรืออาจเป็น bagplots
Andy W

คำตอบ:


33

กับบาง googling ฉันมาในเว็บไซต์ของ Gota Morota ที่มีตัวอย่างของการทำเช่นนี้อยู่แล้วในนั้นเว็บไซต์ของเธอ ด้านล่างนี้คือตัวอย่างที่ขยายไปยังข้อมูลของคุณ

ป้อนคำอธิบายรูปภาพที่นี่

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 ปัญหาคืออะไรกันแน่?
Andy W

@AndyW แต่น่าเสียดายที่รหัสไม่รองรับค่าที่หายไปและฉันไม่พบวิธีที่จะปรับแต่งให้ทำเช่นนั้น
คุณพ่อ

@Fr. คุณต้องการให้มีการจัดการค่าข้อมูลที่ขาดหายไปอย่างไรนอกจากกำจัดข้อสังเกตเหล่านั้น? เทคนิคการใส่ความที่เหมาะสมจะส่งผลให้คะแนนอยู่ในลำตัวนูนของการสังเกตที่ไม่หายไป
Andy W

@ Andy ฉันหมายถึงการNAฆ่าchullฟังก์ชั่น ฉันคาดหวังว่ามันจะไม่สนใจ แต่ก็ล้มเหลวในการทำเช่นนั้นและฉันไม่พบวิธีที่จะใช้na.omit()เพื่อให้มันทำงานได้ ฉันแน่ใจว่าเป็นไปได้ฉันไม่ได้มีทักษะการแฮ็กเกอร์เกินกว่าโซลูชันก่อนหน้านี้
คุณพ่อ

8

ถ้าผมเข้าใจปัญหาของคุณคุณกำลังมองหาเปลือกนูนของและhealth อาจมีหลายแพคเกจการทำเช่นนี้ในการวิจัยเป็นหนึ่งซึ่งเป็นแพคเกจunemployment 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: ตกลงนี่คือสิ่งที่ใช้ ggplot2 เราเปิดXเป็นdata.frameตัวแปรและx yแล้ว:

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

โปรดทราบว่าgeom_pointมีการใช้ข้อมูล ( X) และ AES จาก ggplot geom_polygonในขณะที่ฉันเอาชนะได้ใน

ในการทำให้สมบูรณ์คุณจะต้องใส่เครื่องหมาย x และ y สำหรับฮัลล์สำหรับปัญหาทั้งสองbarนี้โดยใช้คอลัมน์ที่สามissueเพื่อแยกความแตกต่าง


แก้ไขเกี่ยวกับตัวเรือนูน ฉันได้พยายามที่จะใช้chullในการสร้างเปลือกนูน ggplot2แต่ล้มเหลวที่จะใช้ผลกับ
คุณพ่อ

@ ชั้น: ฉันได้แก้ไขคำตอบของฉันแล้ว ดูว่ามันทำให้คุณไปถูกทางหรือไม่
เวย์น

ฉันสามารถดูวิธีการทำงานของมันเอง ggplot2แต่ผมสงสัยว่าจะได้รับที่บรรทัดสุดท้ายด้วย
คุณพ่อ

@ ชั้น: ตกลงแล้วตอนนี้ล่ะ?
Wayne

มันได้ผล! ขอบคุณ ฉันต้องเพิ่ม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กับปัจจัยการจัดกลุ่มจนกว่าฉันจะพบสิ่งนี้
jogall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.