2014-02-23 13 views
5

Ich möchte die 'Kugeln' in der Legende (Guide) von ersetzen. Jetzt ist es eine gekippte a, aber ich möchte einen großen fetten Kreis oder ein Quadrat oder eine andere Form, die die Farbe betonen wird (mehr).Wie die Legende 'Kugel' von Geom_text Guide (Legende) ersetzen

library(ggplot2) 

majdf <- data.frame(lvl = rep(c("A", "B"), each = 50), val = c(rnorm(50, 1), rnorm(50, 3))) 
majtxt <- data.frame(species = c("sp1", "sp2", "sp3"), geq = c(0.01, 2, 2.2)) 

ggplot(majdf, aes(x = val)) + 
    geom_density() + 
    geom_vline(data = majtxt, aes(xintercept = geq)) + 
    geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), angle = 90) + 
    facet_wrap(~ lvl) 

enter image description here

Antwort

3
ggplot(majdf, aes(x = val)) + 
    geom_point(data = majtxt, aes(x = geq, colour = species), 
      y = 0.2, size = 0) + 
    geom_density() + 
    geom_vline(data = majtxt, aes(xintercept = geq)) + 
    geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), 
      angle = 90, show_guide = FALSE) + 
    facet_wrap(~ lvl) + 
    scale_colour_discrete(guide=guide_legend(override.aes=list(size=4))) 

enter image description here

Wie das funktioniert: ein Punkt geom mit der entsprechenden Farbzuordnung hinzufügen. Dies fügt der Legende einen Punkt hinzu. Um jedoch zu verhindern, dass sie in der Grafik angezeigt wird, stellen Sie die Größe des Punktes auf 0 ein. Sagen Sie im Text geom, dass dieser Teil (das gedrehte a) nicht zur Legende hinzugefügt werden soll (show_guide = FALSE). Schließlich wird die Legende genau den Punkt haben, den du willst und nicht die Seitwärtsrichtung; Leider ist es in der gleichen Größe wie in der Handlung gezeichnet, nämlich 0. So verwenden Sie das override.aes Argument zu guide_legend (die an guide in scale_colour_discrete übergeben wird), stellen Sie die Größe des Punktes auf etwas "groß".

Bei diesem Ansatz müssen die Teile nicht auf zwei verschiedenen Plots auseinandergezogen und wieder zusammengefügt werden.

Eine alternative Möglichkeit, die Führungsparameter zum Spezifizieren der guides Funktion verwendet, anstatt es als Argument an der Weitergabe scale_colour_manual:

ggplot(majdf, aes(x = val)) + 
    geom_point(data = majtxt, aes(x = geq, colour = species), 
      y = 0.2, size = 0) + 
    geom_density() + 
    geom_vline(data = majtxt, aes(xintercept = geq)) + 
    geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), 
      angle = 90, show_guide = FALSE) + 
    facet_wrap(~ lvl) + 
    guides(colour = guide_legend(override.aes=list(size=4))) 

Die resultierende Grafik das gleiche ist.

+0

Wenn Sie Ihre Legende in mehr als eine Spalte aufteilen, vergewissern Sie sich, dass Sie die Anzahl der Spalten durch die Skala übergeben, wie zum Beispiel 'scale_colour_discrete (guide = guide_legend (nrow = 2, override.aes ​​= list (size = 4))) 'Sonst bricht die Hölle los. Ein großes Lob an Didzis im R-Chatroom: http://chat.stackoverflow.com/transcript/message/14908487#14908487 –

+0

Hat jemand herausgefunden, warum override.aes ​​nicht gut mit geom_text spielt? – baptiste

5

Dies ist nur ein Hack.

Erstellen Sie das Grundstück mit geom_point:

p1 <- ggplot(majdf, aes(x = val)) + 
    geom_density() + 
    geom_vline(data = majtxt, aes(xintercept = geq)) + 
    geom_point(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), angle = 90) + 
    facet_wrap(~ lvl) 

Das gleiche mit geom_text:

p2 <- ggplot(majdf, aes(x = val)) + 
    geom_density() + 
    geom_vline(data = majtxt, aes(xintercept = geq)) + 
    geom_text(data = majtxt, aes(x = geq, y = 0.2, label = geq, color = species), angle = 90) + 
    facet_wrap(~ lvl) 

Schalten in einen grob und finden, welches Element ist der Führer:

g1 <- ggplotGrob(p1) 
g1 

TableGrob (8 x 10) "layout": 13 grobs 
    z   cells  name          grob 
1 0 (1- 8, 1-10) background   rect[plot.background.rect.2339] 
2 1 (4- 4, 4- 4) panel-1    gTree[panel-1.gTree.2263] 
3 2 (4- 4, 7- 7) panel-2    gTree[panel-2.gTree.2278] 
4 3 (3- 3, 4- 4) strip_t-1 absoluteGrob[strip.absoluteGrob.2306] 
5 4 (3- 3, 7- 7) strip_t-2 absoluteGrob[strip.absoluteGrob.2312] 
6 5 (4- 4, 3- 3) axis_l-1 absoluteGrob[axis-l-1.absoluteGrob.2299] 
7 6 (4- 4, 6- 6) axis_l-2   zeroGrob[axis-l-2.zeroGrob.2300] 
8 7 (5- 5, 4- 4) axis_b-1 absoluteGrob[axis-b-1.absoluteGrob.2285] 
9 8 (5- 5, 7- 7) axis_b-2 absoluteGrob[axis-b-2.absoluteGrob.2292] 
10 9 (7- 7, 4- 7)  xlab    text[axis.title.x.text.2314] 
11 10 (4- 4, 2- 2)  ylab    text[axis.title.y.text.2316] 
12 11 (4- 4, 9- 9) guide-box      gtable[guide-box] 
13 12 (2- 2, 4- 7)  title    text[plot.title.text.2337] 

Kopieren Sie die Anleitung:

g2 <- ggplotGrob(p2) 
g2[[1]][[12]] <- g1[[1]][[12]] 
plot(g2) 

enter image description here

+0

Gibt dies den gewünschten großen fetten Kreis/Quadrat? –