2016-10-24 41 views
8

Rozważmy na przykład tę działkę przy użyciu danych mtcars a funkcja coord_flipJak obracać symbole legendy w ggplot2?

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

faktu, że błędy są poziome paski na wykresie ale pionowy w legendzie denerwuje mnie :) Jak mogę obracać te symbole?

+0

Podnieś kwestię GitHub i poczekaj, aż Hadley dostanie innego stażystę. Lepiej, napisz żądanie ściągnięcia. – alistaire

+2

Być może przydatne http://stackoverflow.com/questions/35703983/how-to-change-angle-of-line-in-customized-legend-in-ggplot2 – user20650

Odpowiedz

3

Nie wymyślę odpowiedzi, która działa w ramach normalnego przepływu pracy ggplot2, więc na razie oto jest hacky odpowiedź. Wyłącz legendę stat_summary. Następnie dodaj geomik punktowy i liniowy z danymi wykraczającymi poza zakres rzeczywistych danych, które chcesz wydrukować. Spowoduje to utworzenie żądanej legendzie linii poziomej i poziomej. Następnie ustaw ograniczenia osi wykresu tak, aby obejmowały tylko zakres rzeczywistych danych, tak aby fałszywe punkty danych nie były widoczne.

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

Innym rozwiązaniem byłoby obrócić grobs legendy klucz o 90 stopni z zastosowaniem funkcji sieciowych, ale zostawię to dla kogoś, kto jest bardziej wykwalifikowanych z grid niż ja.

5

Tweak legendę kluczową

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)) 
} 

Następnie wykreślić

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

Kontynuując użytkownika @ eipi10 sugestii do wykorzystania grid funkcje edycji grobs - odpowiednie grobs są segmenty. Istnieją dwie możliwości: 1) obracanie segmentów grobs; lub 2) edytuj współrzędne x i y punktów końcowych segmentów.

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) 
Powiązane problemy