nhóm theo hai cột trong ggplot2


91

Có thể nhóm theo hai cột không? Vậy tích chéo được vẽ bởi geom_point()geom_smooth()?

Ví dụ như:

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

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

Như vậy điểm 612chia sẻ một nhóm, nhưng không phải với 3.

Câu trả lời:


32

Tại sao không chỉ pastehai cột đó lại với nhau và sử dụng biến đó làm nhóm?

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

Một cách chính thức hơn để làm điều này là sử dụng hàm interaction.


27
Tôi nghĩ rằng bạn không nên sửa đổi của bạn data.framecho mục đích của một âm mưu. Các plotnên vẽ df của bạn và không phải là ngược lại.
ClementWalter

3
Tôi đồng ý, câu trả lời của Blue Magister tốt hơn.
Jeston

6
@clemlaflemme Tôi nghĩ câu trả lời của BlueMagister là ổn, mặc dù tôi nghĩ rằng sự khác biệt trong trường hợp này là khá nhỏ. Nhưng vị trí chung mà người ta không nên sửa đổi khung dữ liệu của bạn cho một âm mưu là một điều gây tò mò cho bạn lựa chọn sử dụng ggplot2 , toàn bộ thiết kế của nó được tạo sẵn về việc cấu trúc dữ liệu của bạn một cách rõ ràng để hoạt động với ngữ nghĩa của ggplot.
joran

Một nhược điểm của pastenó là khi đầu vào là một yếu tố, nó sẽ loại bỏ các mức, nơi interactionduy trì thứ tự của các yếu tố ban đầu. Điều này có nghĩa là các nhóm được sắp xếp tự nhiên hơn với interactioncách tiếp cận.
Kota Mori

173

Lấy ví dụ từ câu hỏi này , sử dụng interactionđể kết hợp hai cột thành một yếu tố mới:

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

ví dụ ggplot


Điều này phù hợp với tôi:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
ivan866

59

ví dụ:

 qplot(round, price, data=firm, group=id, color=id, geom='line') +  
      geom_smooth(aes(group=interaction(size, type)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.