2012-10-09 10 views
16

Ben aynı kategorileri (kedi) paylaşan iki farklı sinyal (ind) kutularını elde etmek için ggplot üzerinde position_dodge kullanmaya çalışıyorum. Bir sinyal için veri içeren, ancak diğeri için olmayan bir kategori olduğunda, verilere sahip olan sinyalin kutucuğu tüm yatay boşlukları kapsar ve o kategori için position_dodge talimatına uymaz. Kaçma kuralını uygulamak için ggplot yapmanın bir yolu var mı? Aşağıdaki örnekte de görebileceğiniz gibi, x sinyalinin B kategorisi için bir veri içermediği için, position_dodge tarafından ayrılmış alanı kaybeder. Bundan kaçınmak istiyorum.Ggplot'un position_dodge'ını veri içermeyen kategoriler üzerinde nasıl uygulanır?

Şimdiden teşekkürler.

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
       values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
       ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) 

print(ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(
      aes(x=as.factor(cat), y=values, 
       fill=ind), 
      position=position_dodge(width=.60), 
      data=data, 
      outlier.size = 1.2, 
      na.rm=T)) 

graph with original problem

İLERLEME bazı geçici çözümler sonra ben için ... (tür) arıyordu sonuca

data   <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

p <- ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
     position=position_dodge(width=.60), 
     data=data, 
     outlier.size = 1.2, 
     na.rm=T) + 
     geom_line(aes(x=x, y=y), 
       data=data.frame(x=c(0,3),y=rep(0,2)), 
       size = 1, 
       col='white') 
print(p) 

solution with workaround

ile geldi

GÜNCELLEME

Bazı insanlar, etkilerini etkilemek için faceting kullanarak anted. Faceting bana aradığım etkiyi vermiyor. y en

final graph

Dikkat edilirse beyaz büyük onay işareti = 10 diğer kene işaretleri daha kalındır: aradığım nihai grafik aşağıda gösterilmiştir. Bu daha kalın satır, istenmeyen kutucuklarını gizleyen boyut = 1 olan geom_line'dır.

Farklı geom nesnelerini daha sorunsuz bir şekilde birleştirebilseydik. Bunu Hadley'in github'unda bir böcek olarak rapor ettim, ama Hadley bunun position_dodge'un tasarımla nasıl davrandığını söyledi. Ben standart olmayan bir şekilde ggplot2 kullanıyorum sanırım ve geçici çözümler bu tür konularda devam etmenin yoludur. Her neyse, umarım bu, bazı üyelerin ggplot işlevlerini biraz daha ileriye taşımasına yardımcı olur.

+1

2.5 yıl sonra bunu halletmenin daha iyi bir yolu var mı? Bende aynı durum var. Ben çiziyorum değişkeninin tüm eksik faktör seviyesi kombinasyonları için NA ile bir veri seti oluşturmak için expand.grid() kullanmayı denedim ve göz ardı ediliyor gibi görünüyor. – Michael

+0

https://github.com/hadley/ggplot2/issues/688 Belki de yok :( – Michael

+0

Ben ggplot kodunu bir işleve sardım ve beyaz çizgi y ekseni konumunu bu işlevin bir parametresi haline getirdim Nedeni, eğer veri y = 0 ile kesişirse, beyaz çizginin altına düşecek ve bu da çözümün çok belirgin ve dikkati dağılmasına neden olacaktır: – JAponte

cevap

1

bazı geçici çözümler sonra ben için ... (tür) arıyordu sonuca

data   <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

p <- ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
     position=position_dodge(width=.60), 
     data=data, 
     outlier.size = 1.2, 
     na.rm=T) + 
     geom_line(aes(x=x, y=y), 
       data=data.frame(x=c(0,3),y=rep(0,2)), 
       size = 1, 
       col='white') 
print(p) 

solution with workaround

Bazı insanlar istediğim etki için Faceting kullanılarak önerilen geldi. Faceting bana aradığım etkiyi vermiyor. y en

final graph

Dikkat edilirse beyaz büyük onay işareti = 10 diğer kene işaretleri daha kalındır: aradığım nihai grafik aşağıda gösterilmiştir. Bu daha kalın satır, istenmeyen kutucuklarını gizleyen boyut = 1 olan geom_line'dır.

Farklı geom nesnelerini daha sorunsuz bir şekilde birleştirebilseydik. Bunu Hadley'in github'unda bir böcek olarak rapor ettim, ama Hadley bunun position_dodge'un tasarımla nasıl davrandığını söyledi. Ben standart olmayan bir şekilde ggplot2 kullanıyorum sanırım ve geçici çözümler bu tür konularda devam etmenin yoludur. Her neyse, umarım bu, bazı üyelerin ggplot işlevlerini biraz daha ileriye taşımasına yardımcı olur.

2

x B'nin hiçbir değeri yoktur, bu nedenle "B", 0, "x" yi ekleyebilirsiniz, bu da temelde B'nin x değeri için "değerlerin" dağılımının olmadığını gösterir. Medyan ve diğer yüzdelikler sıfırdır. Automagically yanlarına üstesinden gelecektir geom_boxplot -

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
      values=c(3,2,1,4,NA,NA,4,5,6,7,8,9,0), 
      ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

Ayrıca bir faktör, ggplot olarak x göz önüne aldığımızda, çünkü burada pozisyon parametreleri eklemek gerekmez. kredi Hadley, ggplot2 paketinin bakımcıya gider böylece

print(ggplot() + 
    scale_colour_hue(guide='none') + 
    geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
    data=data, 
    outlier.size = 1.2, 
    na.rm=T)) 

+3

Bu biraz yanlış olabilir IMO ekliyor. İdeal çözümde sıfırda hiç kutu veya "hat" olmazdı. Bana göre, bu, B için 'x' nin 0'da değerlere sahip olduğu anlamına gelir, ki bu istenen etki değildir. –

+0

@ RomanLuštrik: Bu ideal durumda, "x B" için ayrılmış bir alana sahip olmayan bir kutu taslağı ile giderdim ve bu benim araştırmamda yaptığım şey. Eğer "x of B" için 0 değerini kullanırsam, o zaman faktörler (katsayı) değerleri için temel değerin küçük bir tanımını içeririm. Sonuçlarının nasıl yorumlandığına bağlı. OP, aslında x'in değerleri kategorik olduğunda uygulanmış olan position_dodge parametrelerini kullanmaya çalışıyordu. – Sathish

+0

@Sathish geribildirim için teşekkürler! Bu harika bir başlangıç. Dodge parametresi .6'ya ayarlanır, böylece ilgili kutucuklar ilişkilerini yansıtacak kadar üst üste gelirler, ancak o kadar fazla veri kalmazlar ki bu da veriyi kısmen saklar.Değerleri olmayan kategoriler için sahte kutularla yaşayabilirdim, ama belki de boş davalar için onları şeffaflaştırmam gerek. Sorunu göndermeden önce mümkün olduğunca basitleştirdim, ancak orijinal grafik biraz daha karmaşık. X ekseninde daha fazla (50+) kategori içerebilir. – JAponte

1

Ben sadece onun Git site de Hadley tarafından yayınlanan yorumlar birinden Faceting kullanmak için bir ipucu!

İstediğiniz bu olup olmadığını görün.Bu parselde bıyık ve diğerlerini ayarlama konusunda seçenekler hakkında daha fazla bilgi edinmek için ggplot2 pakette bu yardım sayfasına bakın:

?stat_boxplot 

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
      values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
      ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) 

p <- ggplot(data = data, aes(factor(cat), values))      
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind) 

enter image description here

Bence gereksiz bir tanesidir senin arsa, renkler eklemek için zaten "ind" değişkeni dayalı arsa Faceting gibi, bu deneyin:

p <- ggplot(data, aes(factor(cat), values, fill = ind))      
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind) 

enter image description here

HTH !

+0

Sadece eksik değerleri doldurmak için fazladan temel veri noktaları eklemek yerine, daha önce faceting kullanmanız gerektiğini öneren aklıma geldi ve ben de Hadley'nin ggplot2'deki kitabından facebook'u hatırlıyorum. – Sathish

+0

Yardımınız için teşekkürler @sathish. Kendi sorumu cevapladım ama henüz kabul etmedim, çünkü Hadley şimdi benim geçici çözümümün gerekmeyeceğini düşünüyor. Birkaç gün önce gönderdiğim hata raporunu yeniden açtı. Kesin bir çözüm bulup bulmadığımızı görmek için bir hafta daha veriyorum. Tekrar teşekkürler! – JAponte

+0

Harika! GIT'de rapor verdiğini bilmiyordum, her neyse parmağımızı geçelim ve umarım birileri size gerekli seçenekleri sunar. – Sathish

İlgili konular