2012-09-24 13 views
12

Próbuję utworzyć fasetowany dział z odwróconymi współrzędnymi, gdzie jedna i tylko jedna z osi mogą różnić się dla każdego aspektu:Używanie coord_flip() z facet_wrap (scales = "free_y") w ggplot2 wydaje się dawać nieoczekiwane znaczniki osi znacznika i etykiety znaczników

require(ggplot2) 
p <- qplot(displ, hwy, data = mpg) 
p + facet_wrap(~ cyl, scales = "free_y") + coord_flip() 

enter image description here

Ta działka nie jest satysfakcjonujące dla mnie, ponieważ niewłaściwe znaki tick tick i etykiety są powtarzane dla każdego poletka. Chcę zaznaczyć na każdej poziomej osi, nie na każdej pionowej osi.

Jest to nieoczekiwane zachowanie, ponieważ wykres sugeruje, że znaki podziałki osi poziomej są takie same dla górnych paneli, jak dla dolnych, ale tak nie jest. Aby zobaczyć to Run:

p <- qplot(displ, hwy, data = mpg) 
p + facet_wrap(~ cyl, scales = "fixed") + coord_flip() 

Więc moje pytanie brzmi: czy istnieje sposób, aby usunąć znaki pionowe oś kleszcza do odpowiednich aspektów i dodać poziome znaki oś zaznaczyć i etykiet do najlepszych aspektów?

Jak Paul wnikliwie wskazuje poniżej, przykład, który podałem, można rozwiązać, zamieniając xiy w qplot() i unikając funkcji coord_flip(), ale to nie działa na przykład dla wszystkich geomów, jeśli chcę mieć poziome fasety bar działka z bezpłatnych osi poziomej mogę uruchomić:

c <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar() 
c + facet_wrap(~cut, scales = "free_y") + coord_flip() 

image

te aspekty mają zmienną osiach poziomych, ale powtarzających się znaków podziałki osi pionowej zamiast powtarzających osiach poziomych znaczników. Nie sądzę, że sztuczka Paula zadziała tutaj, ponieważ w przeciwieństwie do wykresów punktowych, wykresy słupkowe nie są obrotowo symetryczne.

Byłbym bardzo zainteresowany usłyszeć jakiekolwiek częściowe lub kompletne rozwiązania.

+0

Myślę, że Twój punkt jest ważny. Możesz wysłać wiadomość e-mail na listę dyskusyjną ggplot2 lub utworzyć bilet w module śledzenia problemów github ggplot2. –

+0

Gotowe. https://github.com/hadley/ggplot2/issues/673 – orizon

+0

Wysyłaj nam wiadomości o aktualizacjach. –

Odpowiedz

6

Jest to drugi lub trzeci czas sam wpadłem na ten problem. Odkryłem, że mogę zhakować własne rozwiązanie, definiując niestandardowy geom.

geom_bar_horz <- function (mapping = NULL, data = NULL, stat = "bin", position = "stack", ...) { 
    GeomBar_horz$new(mapping = mapping, data = data, stat = stat, position = position, ...) 
} 

GeomBar_horz <- proto(ggplot2:::Geom, { 
    objname <- "bar_horz" 

    default_stat <- function(.) StatBin 
    default_pos <- function(.) PositionStack 
    default_aes <- function(.) aes(colour=NA, fill="grey20", size=0.5, linetype=1, weight = 1, alpha = NA) 

    required_aes <- c("y") 

    reparameterise <- function(., df, params) { 
    df$width <- df$width %||% 
     params$width %||% (resolution(df$x, FALSE) * 0.9) 
    OUT <- transform(df, 
       xmin = pmin(x, 0), xmax = pmax(x, 0), 
       ymin = y - .45, ymax = y + .45, width = NULL 
    ) 
    return(OUT) 
    } 

    draw_groups <- function(., data, scales, coordinates, ...) { 
    GeomRect$draw_groups(data, scales, coordinates, ...) 
    } 
    guide_geom <- function(.) "polygon" 
}) 

to tylko kopiowanie kodu geom_bar z github ggplot2 i Przełączanie x i pręd odniesienia do poziomą barplot w standardowych koordynatorów kartezjańskich.

pamiętać, że koniecznością użycie position='identity' i ewentualnie również stat='identity' to zadziałało. Jeśli chcesz użyć pozycji innej niż tożsamość, musisz edytować edytor collide function, aby działał poprawnie.

8

Używanie w połączeniu z facet_wrap jest problemem. Najpierw definiujesz pewną oś, która ma być wolna (oś x), a następnie zamieniasz oś, czyniąc oś y wolną. W tej chwili to nie jest dobrze reprodukowane w ggplot2.

W pierwszym przykładzie, polecam nie używając coord_flip, ale po prostu zamiana zmiennych wokół w wywołaniu qplot i używając free_x:

p <- qplot(hwy, displ, data = mpg) 
p + facet_wrap(~ cyl, scales = "free_x") 

enter image description here

+1

OK, otrzymuję teraz twoje pytanie. Unikałbym używania razem 'facet_wrap' i' coord_flip'. Po prostu odwróć zmienne w wywołaniu 'qplot'. Zobacz moją zaktualizowaną odpowiedź. –

+1

Działa to dobrze dla wykresów punktowych, ale nie dla histogramu. Obecnie mam ten sam problem z wykresami słupkowymi, że chcę być poziomy i nie mogę znaleźć drogi. –

2

Właśnie próbowałem zrobić poziomą kurtynę i wpadłem na ten problem, gdzie chciałem scales = "free_x". Ostatecznie łatwiej było stworzyć konwencjonalny (pionowy) planszę), obrócić tekst tak, że jeśli przechylisz głowę w lewo, wygląda to tak, jak chcesz. I wtedy, gdy twoja działka jest zakończona, obrócić wyjście PDF/obrazu (!)

ggplot(data, aes(x, y)) + 
    geom_bar(stat = "identity") + 
    facet_grid(var ~ group, scale = "free", space = "free_x", switch = "both") + 
    theme(axis.text.y = element_text(angle=90), axis.text.x = element_text(angle = 90), 
        strip.text.x = element_text(angle = 180)) 

Główne klawisze to zrobić mają switch = "both", który porusza etykiety fazowane do drugiej osi, a element_text(angle=90) który obraca etykiety osi i tekst.

Powiązane problemy