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.

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.


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


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)))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.