Wie fügt man Facetten in ggplot2 eine allgemeine Bezeichnung hinzu?

82

Ich habe oft numerische Werte für das Facettieren. Ich möchte ausreichende Informationen bereitstellen, um diese Facettenwerte in einem ergänzenden Titel zu interpretieren, ähnlich wie bei den Achsentiteln. Die Beschriftungsoptionen wiederholen viel unnötigen Text und sind für längere variable Titel unbrauchbar.

Irgendwelche Vorschläge?

Der Standard:

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)

Geben Sie hier die Bildbeschreibung ein

Was ich lieben würde:

Geben Sie hier die Bildbeschreibung ein

Das Beste, was ich in ggplot tun kann:

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

Geben Sie hier die Bildbeschreibung ein

Wie von @Hendy angegeben, ähnlich wie: Hinzufügen einer sekundären y-Achse zu ggplot2-Plots - machen Sie es perfekt

Etienne Low-Décarie
quelle
1
Heiliger Bimbam. Ich habe nur danach gesucht, dies über Google gefunden ... und jetzt sehe ich, dass es vor einer Minute gefragt wurde. Diese Frage scheint aufgrund seines Kommentars dasselbe zu stellen, trotz des Titels, der etwas anderes implizieren könnte. Tolle Modelle zur Veranschaulichung. Dies ist genau mein Problem - es wäre schön, wenn ich meine numerischen Facettenkategorien nicht erklären müsste. Das Diagramm sollte für sich selbst mit einer einfachen Beschriftung sprechen, in der die Facettenvariablen erläutert werden.
Hendy
3
Ich erkundigte mich per E-Mail bei Winston Chang (kenne seinen SO-Handle nicht), einem der wichtigsten Entwickler von ggplot. Er glaubt nicht, dass dies derzeit eine Option ist, könnte aber in Betracht ziehen, sie hinzuzufügen. Er schlug vor, dass ich ein Problem auf Github hinzufüge, also tat ich es
Hendy
1
Sieht so aus, als wäre dies auf der Mailingliste aufgetaucht und Winston hat es mich wissen lassen. Er schuf eine Niederlassung mit einer allgemeinen Implementierung für Top-Labels. Siehe den Thread hier . @ Hadley: Du bist richtig. Ich habe keine Ahnung, wie schwer es im Allgemeinen ist. Wenn dies nie passiert ... meine Dankbarkeit für ggplot herrscht immer noch vor :)
Hendy
1
Irgendwann höre ich auf zu versuchen, R / ggplot2 zu streiten und einige gewünschte Änderungen mit einem Bildeditor vorzunehmen.
Andy
2
Gibt es hier ein Update zu Best Practice?
Arthur Yip

Antworten:

49

Da die neuesten ggplot2Anwendungen gtableintern verwendet werden, ist es recht einfach, eine Zahl zu ändern:

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)

Geben Sie hier die Bildbeschreibung ein

Natürlich können Sie eine Funktion schreiben, die die Streifenbeschriftungen automatisch hinzufügt. Eine zukünftige Version von verfügt ggplot2möglicherweise über diese Funktionalität. Ich bin mir allerdings nicht sicher.

kohske
quelle
- Ich frage mich, ob dies ab Version 0.9.3.1 immer noch der sauberste Ansatz ist. Ich sehe in der neuesten Dokumentation docs.ggplot2.org/0.9.3.1
yosukesabai
1
Version 0.9.3.1 sieht ggplotGrob()dasselbe vor wie ggplot_gtable(ggplot_build()). Ich denke, das ist immer noch der beste Weg.
Kohske
1
Wenn ich mich nicht irre, ist diese Lösung nicht mehr gültig, da einige Funktionen jetzt veraltet sind.
Remi.b
1
@ Remi.b versuchen Sie es jetzt
rawr
3
Dies funktioniert nicht mit ggplot2 3.2.1 und R 3.6.1. Keine Fehlermeldung, aber ich erhalte keine Beschriftungen auf dem resultierenden Plot.
Calimo
5

Es gibt vielleicht einen besseren Weg, aber Sie können:

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
Diogo
quelle
1

Zusätzlich zu der von kohske beschriebenen Methode können Sie den durch Ändern hinzugefügten Feldern einen Rahmen hinzufügen

col=NA

zu

col=gray(0.5), linetype=1

Ändern Sie auch

fill=gray(0.5)

zum

fill=grey(0.8)

und

gp=gpar(col=gray(1))

zu

gp=gpar(col=gray(0))

Wenn Sie möchten, dass die neuen Balken mit den Facettenbeschriftungen übereinstimmen

dh

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)))
Shannon Hodges
quelle