จัดกลุ่มตามสองคอลัมน์ใน ggplot2


91

เป็นไปได้ไหมที่จะจัดกลุ่มตามสองคอลัมน์ ดังนั้นผลิตภัณฑ์ไขว้จึงถูกวาดโดยgeom_point()และgeom_smooth()?

ดังตัวอย่าง:

frame <- data.frame(
 series <- rep(c('a', 'b'), 6), 
 sample <- rep(c('glass','water', 'metal'), 4), 
 data <- c(1:12))

ggplot(frame, aes()) # ...

ดังกล่าวว่าจุด6และ12แบ่งปันกลุ่ม 3แต่ไม่ได้มี

คำตอบ:


32

ทำไมไม่เพียงแค่pasteสองคอลัมน์นั้นรวมกันแล้วใช้ตัวแปรนั้นเป็นกลุ่ม?

frame$grp <- paste(frame[,1],frame[,2])

interactionเป็นวิธีที่ค่อนข้างเป็นทางการมากขึ้นการทำเช่นนี้จะใช้ฟังก์ชั่น


27
ฉันคิดว่าคุณไม่ควรแก้ไขของคุณdata.frameเพื่อจุดประสงค์ของพล็อต plotควรวางแผน DF และไม่ได้ตรงข้ามของคุณ
ClementWalter

3
ฉันเห็นด้วยคำตอบของ Blue Magister ดีกว่า
Jeston

6
@clemlaflemme ฉันคิดว่าคำตอบของ BlueMagister นั้นดีแม้ว่าฉันคิดว่าความแตกต่างในกรณีนี้ค่อนข้างน้อย แต่ตำแหน่งทั่วไปที่ไม่ควรแก้ไขกรอบข้อมูลของคุณสำหรับพล็อตคือสิ่งที่อยากรู้อยากเห็นที่คุณเลือกใช้ggplot2ซึ่งการออกแบบทั้งหมดนั้นมีพื้นฐานมาจากการจัดโครงสร้างข้อมูลของคุณอย่างชัดเจนเพื่อให้ทำงานกับความหมายของ ggplot
joran

ข้อเสียpasteคือเมื่ออินพุตเป็นปัจจัยมันจะละทิ้งระดับโดยที่interactionรักษาลำดับของปัจจัยดั้งเดิมไว้ ซึ่งหมายความว่ากลุ่มต่างๆจะเรียงลำดับตามinteractionแนวทางอย่างเป็นธรรมชาติมากขึ้น
Kota Mori

176

นำตัวอย่างจากคำถามนี้มาใช้interactionเพื่อรวมสองคอลัมน์ให้เป็นปัจจัยใหม่:

# Data frame with two continuous variables and two factors 
set.seed(0)
x <- rep(1:10, 4)
y <- c(rep(1:10, 2)+rnorm(20)/5, rep(6:15, 2) + rnorm(20)/5)
treatment <- gl(2, 20, 40, labels=letters[1:2])
replicate <- gl(2, 10, 40)
d <- data.frame(x=x, y=y, treatment=treatment, replicate=replicate)

ggplot(d, aes(x=x, y=y, colour=treatment, shape = replicate,
  group=interaction(treatment, replicate))) + 
  geom_point() + geom_line()

ตัวอย่าง ggplot


สิ่งนี้ใช้ได้กับฉัน:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
ivan866

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.