Ggplot2'deki yönlere nasıl genel bir etiket eklersiniz?


84

Yüz oluşturma için genellikle sayısal değerlere sahibim. Eksen başlıklarına benzer şekilde ek bir başlıkta bu fasetleme değerlerini yorumlamak için yeterli bilgi sağlamak istiyorum. Etiketleyici seçenekleri çok fazla gereksiz metni tekrarlar ve daha uzun değişken başlıklar için kullanılamaz.

Herhangi bir öneri?

Varsayılan:

test<-data.frame(x=1:20, y=21:40, facet.a=rep(c(1,2),10), facet.b=rep(c(1,2), each=20))
qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

görüntü açıklamasını buraya girin

Ne isterdim:

görüntü açıklamasını buraya girin

Ggplot'ta yapabileceğim en iyi şey:

qplot(data=test, x=x, y=y)+facet_grid(facet.b~facet.a, labeller=label_both)

görüntü açıklamasını buraya girin

@Hendy tarafından belirtildiği gibi, şuna benzer: ggplot2 grafiklerine ikincil bir y ekseni ekleyin - onu mükemmel hale getirin


1
Kutsal inek. Ben edildi sadece bu seyir için, google aracılığı buldum ... ve şimdi bir dakika önce istendi görüyoruz. Bu soru , aksi ima edilebilecek başlığa rağmen, yorumuna dayanarak aynı şeyi soruyor gibi görünüyor. Göstermek için harika örnekler. Bu tam olarak benim sorunum - sayısal özellik kategorilerimi açıklamama gerek kalmasaydı güzel olurdu. Grafik, yontma değişkenlerinin ne olduğunu açıklayan basit bir etiketle kendi adına konuşmalıdır.
Hendy

3
E-posta yoluyla ana ggplot geliştiricilerinden biri olan Winston Chang'a (SO tanıtıcısını bilmiyorum) sordum. Bunun şu anda bir seçenek olduğunu düşünmüyor, ancak eklemeyi düşünebilir. Github'a bir sorun eklememi önerdi, ben de yaptım
Hendy

1
Görünüşe göre bu posta listesinde çıktı ve Winston bana haber verdi. En iyi etiketler için bunun genel bir uygulamasını içeren bir şube yarattı. Konuya buradan bakın . @hadley: haklısın. Genel olarak yapmanın ne kadar zor olduğu hakkında hiçbir fikrim yok. Bu asla olmazsa ... ggplot'a olan minnettarlığım hala geçerli :)
Hendy

1
Bir noktada R / ggplot2 ile uğraşmayı bırakıp bir resim düzenleyici kullanarak istediğim bazı değişiklikleri yapıyorum.
Andy

2
buradaki en iyi uygulama hakkında herhangi bir güncelleme var mı?
Arthur Yip

Yanıtlar:


49

En son olarak ggplot2kullanımları gtableiçten, bir rakam değiştirmek oldukça kolaydır:

library(ggplot2)
test <- data.frame(x=1:20, y=21:40, 
                   facet.a=rep(c(1,2),10), 
                   facet.b=rep(c(1,2), each=20))
p <- qplot(data=test, x=x, y=y, facets=facet.b~facet.a)

# get gtable object
z <- ggplotGrob(p)

library(grid)
library(gtable)
# add label for right strip
z <- gtable_add_cols(z, unit(z$widths[[7]], 'cm'), 7)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 1", rot = -90, gp = gpar(col = gray(1)))),
                     4, 8, 6, name = paste(runif(2)))

# add label for top strip
z <- gtable_add_rows(z, unit(z$heights[[3]], 'cm'), 2)
z <- gtable_add_grob(z, 
                     list(rectGrob(gp = gpar(col = NA, fill = gray(0.5))),
                          textGrob("Variable 2", gp = gpar(col = gray(1)))),
                     3, 4, 3, 6, name = paste(runif(2)))

# add margins
z <- gtable_add_cols(z, unit(1/8, "line"), 7)
z <- gtable_add_rows(z, unit(1/8, "line"), 3)

# draw it
grid.newpage()
grid.draw(z)

görüntü açıklamasını buraya girin

Elbette, şerit etiketlerini otomatik olarak ekleyen bir işlev yazabilirsiniz. Ürününün gelecekteki bir sürümü ggplot2bu işleve sahip olabilir; Yine de emin değilim.


- Bunun 0.9.3.1 sürümünden itibaren hala en temiz yaklaşım olup olmadığını merak ediyorum. En son belgelerde "bu işlevsellik
yosukesabai

1
Sürüm 0.9.3.1 ggplotGrob(), aynı şeyi sağlar ggplot_gtable(ggplot_build()). Bence bu hala en iyi yol.
kohske

1
Yanılmıyorsam, bazı işlevler artık kullanımdan kaldırıldığı için bu çözüm artık geçerli değil.
Remi.b

1
@ Remi.b şimdi deneyin
rawr

3
Bu, ggplot2 3.2.1 ve R 3.6.1 ile çalışmıyor. Hata mesajı yok, ancak ortaya çıkan grafikteki etiketleri alamıyorum.
Calimo

5

Bunu yapmanın daha iyi bir yolu olabilir, ancak şunları yapabilirsiniz:

fac1 = factor(rep(c('a','b'),10))
fac2 = factor(rep(c('a','b'),10))
data = data.frame(x=1:10, y=1:10, fac1=fac1, fac2=fac2)
p = ggplot(data,aes(x,y)) + ggplot2::geom_point() + 
facet_grid(fac1~fac2)
p + theme(plot.margin = unit(c(1.5,1.5,0.2,0.2), "cm"))
grid::grid.text(unit(0.98,"npc"),0.5,label = 'label ar right', rot = 270) # right
grid::grid.text(unit(0.5,"npc"),unit(.98,'npc'),label = 'label at top', rot = 0)   # top

1

Kohske tarafından özetlenen yönteme ek olarak, değiştirerek eklenen kutulara bir kenarlık ekleyebilirsiniz.

col=NA

-e

col=gray(0.5), linetype=1

Ayrıca değiştir

fill=gray(0.5)

için

fill=grey(0.8)

ve

gp=gpar(col=gray(1))

-e

gp=gpar(col=gray(0))

Yeni çubukların faset etiketleriyle eşleşmesini istiyorsanız

yani

z <- gtable_add_grob(z, 
      list(rectGrob(gp = gpar(col = gray(0.5), linetype=1, fill = gray(0.8))),
      textGrob("Variable 1", rot = -90, gp = gpar(col = gray(0)))),
      4, 8, 6, name = paste(runif(2)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.