kelompokkan dengan dua kolom di ggplot2

91

Apakah mungkin untuk dikelompokkan menjadi dua kolom? Jadi produk silang digambar oleh geom_point()dan geom_smooth()?

Sebagai contoh:

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

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

Sehingga poin 6dan 12berbagi grup, tetapi tidak dengan 3.

Reactormonk
sumber

Jawaban:

32

Mengapa tidak hanya pastedua kolom bersama-sama dan penggunaan yang variabel sebagai kelompok?

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

Cara yang agak lebih formal untuk melakukan ini adalah dengan menggunakan fungsi tersebut interaction.

joran
sumber
27
Saya pikir Anda tidak harus memodifikasi Anda data.frameuntuk tujuan plot. Itu plotharus memplot df Anda dan bukan sebaliknya.
ClementWalter
3
Saya setuju, jawaban Blue Magister lebih baik.
Jeston
6
@clemlaflemme Saya rasa jawaban BlueMagister baik-baik saja, meskipun menurut saya perbedaan dalam kasus ini cukup kecil. Tetapi posisi umum bahwa seseorang tidak boleh memodifikasi bingkai data Anda untuk sebuah plot adalah hal yang aneh mengingat pilihan Anda untuk menggunakan ggplot2 , seluruh desain yang didasarkan pada penataan data Anda secara eksplisit untuk bekerja dengan semantik ggplot.
joran
Kerugiannya pasteadalah bahwa ketika input adalah sebuah faktor, ia membuang level-levelnya, yang interactionmempertahankan urutan faktor aslinya. Ini berarti bahwa kelompok-kelompok tersebut lebih teratur dengan interactionpendekatan.
Kota Mori
174

Mengambil contoh dari pertanyaan ini , menggunakan interactionuntuk menggabungkan dua kolom menjadi faktor baru:

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

contoh ggplot

Magister Biru
sumber
Ini bekerja untuk saya:ggplot(df) + geom_violin(aes(class1, metric.var, group = interaction(class1, class2)), position = position_dodge(width=.5))
ivan866
59

sebagai contoh:

 qplot(round, price, data=firm, group=id, color=id, geom='line') +  
      geom_smooth(aes(group=interaction(size, type)))
Davoud Taghawi-Nejad
sumber