2016-10-24 1 views
8

zum Beispiel Betrachten Sie diese Handlung die Daten mtcars und die Funktion auf der Graph coord_flipWie man Legendsymbole in ggplot2 dreht?

library(ggplot2) 
library(Hmisc) 

ggplot(mtcars,aes(x=gear,y=cyl)) + stat_summary(aes(color=as.factor(rep(1:2,16))), 
fun.data=mean_cl_boot, position=position_dodge(0.4)) + coord_flip() 

enter image description here

Die Tatsache, dass die Fehlerbalken horizontal verwenden, aber vertikal in der Legende stört mich :) Wie kann ich drehen diese Symbole?

+0

Erheben Sie ein GitHub-Problem und warten Sie, bis Hadley einen anderen Praktikanten bekommt. Besser, schreibe eine Pull-Anfrage. – alistaire

+2

vielleicht nützlich http://stackoverflow.com/questions/35703983/how-to-change-angle-of-line-in-customized-legend-in-gplplot2 – user20650

Antwort

3

Ich bin nicht mit einer Antwort, die innerhalb der normalen ggplot2 Workflow funktioniert, so für den Moment, hier ist eine hacky Antwort. Schalten Sie die stat_summary Legende aus. Fügen Sie dann Punkt- und Liniengeome mit Daten hinzu, die außerhalb des Bereichs der tatsächlichen Daten liegen, die Sie plotten möchten. Dadurch werden die gewünschte Punkt- und horizontale Linienlegende erstellt. Legen Sie dann die Grenzen der Plotachse so fest, dass sie nur den Bereich Ihrer realen Daten einschließen, sodass die falschen Datenpunkte nicht sichtbar sind.

ggplot(mtcars, aes(x=gear, y=cyl, color=as.factor(rep(1:2,16)))) + 
    stat_summary(fun.data=mean_cl_boot, position=position_dodge(0.4), show.legend=FALSE) + 
    geom_line(aes(y=cyl-100)) + 
    geom_point(aes(y=cyl-100), size=2.5) + 
    coord_flip(ylim=range(mtcars$cyl)) 

enter image description here

Eine andere Möglichkeit wäre die Legende schlüssel Grobs um 90 Grad Funktionen Gitter zu drehen, aber ich werde, dass für jemanden verlassen, der mit grid geschickter ist als ich.

5

Tweak die Legende Schlüssel

GeomPointrange$draw_key <- function (data, params, size)  { 

     draw_key_vpath <- function (data, params, size) { 
      # only need to change the x&y coords so that the line is horizontal 
      # originally, the vertical line was `0.5, 0.1, 0.5, 0.9` 
       segmentsGrob(0.1, 0.5, 0.9, 0.5, 
       gp = gpar(col = alpha(data$colour, data$alpha), 
       lwd = data$size * .pt, lty = data$linetype, 
       lineend = "butt"), arrow = params$arrow) 
       } 

    grobTree(draw_key_vpath(data, params, size), 
      draw_key_point(transform(data, size = data$size * 4), params)) 
} 

Dann

ggplot(mtcars,aes(x=gear,y=cyl)) + 
    stat_summary(aes(color=as.factor(rep(1:2,16))), 
        fun.data=mean_cl_boot, position=position_dodge(0.4)) + 
    coord_flip() 
2

Anknüpfend @ eipi10 Vorschlag grid Funktionen zu nutzen plotten die Grobs bearbeiten - die entsprechenden Grobs Segmente sind. Es gibt zwei Möglichkeiten: 1) rotiere die Segment-Grobs; oder 2) editiere die X- und Y-Koordinaten der Endpunkte der Segment-Grobs.

library(ggplot2) 
library(Hmisc) 

library(grid) 

p = ggplot(mtcars,aes(x=gear,y=cyl)) + 
    stat_summary(aes(color=as.factor(rep(1:2,16))), 
        fun.data=mean_cl_boot, position=position_dodge(0.4)) + 
    coord_flip() 

g = ggplotGrob(p) 

# Get names of segment grobs 
grid.ls(grid.force(g))$name # "GRID.segments" 

# Check the structure of the segment grobs 
str(getGrob(grid.force(g), gPath("GRID.segments"), grep = TRUE, global = TRUE)) 

# Edit the segment grobs using the editGrob() function 
# 1) Rotate the segments 
    g <- editGrob(grid.force(g), gPath("GRID.segments"), grep = TRUE, global = TRUE, 
     vp = viewport(angle = 90)) 

# 2) set end points of segments 
# g <- editGrob(grid.force(g), gPath("GRID.segments"), grep = TRUE, global = TRUE, 
#   x0 = unit(0.1, "npc"), y0 = unit(0.5, "npc"), x1 = unit(0.9, "npc"), y1 = unit(0.5, "npc")) 

# Draw it 
grid.newpage() 
grid.draw(g)