2016-07-04 26 views
3

Ich versuche mehrere Faktoren Spalten in einem Schritt zu plotten, mit ggplot2 als Plotten-Engine.Wie plotten mehrere Faktor Spalten mit ggplot?

mehr metrische Spalt Plotten ist einfach:

library(ggplot2) 
library(dplyr) # dplyr 0.5.0 select_if 
library(purrr) 
data(diamonds) 


diamonds %>% 
    select_if(is.numeric) %>% 
    gather %>% 
    ggplot(aes(x = value)) + 
    geom_histogram() + 
    facet_wrap(~key) 

plot multiple quantitative variables

Allerdings habe ich in Plotten mehrere Faktor (qualitativ) Spalten in einem Schuss nicht Erfolg habe. Ich möchte Spalten programmgesteuert auswählen, dh nicht direkt benennen.

habe ich versucht, diese, aber es tut nicht ein vernünftiges Ergebnis produzieren:

diamonds %>% 
    select_if(is.factor) %>% 
    gather %>% 
    ggplot(aes(x = value)) + geom_bar() + 
    facet_wrap(~key) + 
    coord_flip() 

enter image description here

Ich gehe davon aus, dass es könnte eine Lösung in dieser Richtung:

diamonds %>% 
    select_if(is.factor) %>% 
    ggplot(aes(x = .[[1]])) + geom_bar() 

Wo .[[1]] sollte durch einen Spaltenplatzhalter ersetzt werden (also hier habe ich direkt die Spalte benannt, die ich li.) Ke zu vermeiden, wie ich eine große Anzahl von Spalten in der Realität habe).

Eine For-Schleife wird wahrscheinlich die Arbeit machen, aber ich würde gerne mit dplyr dorthin gelangen.

+1

Können Sie erklären, was Sie für ein vernünftiges Ergebnis halten würden, d. H. Wie sich Ihre zweite Zahl von Ihrer gewünschten Ausgabe unterscheidet? Ist das Hauptproblem die Tatsache, dass jedes Diagramm keine eigene Y-Achse hat (und daher die alphabetische Sortierung ziemlich bedeutungslos ist)? – mkt

+1

#mkt, danke für deinen Kommentar, #Axeman hatte eine gute Idee, das war, was ich suchte –

Antwort

3

Der Trick hier ist, scales = free innerhalb Ihrer facet Aufruf verwenden. Zum Beispiel:

diamonds %>% 
    select_if(is.factor) %>% 
    gather %>% 
    ggplot(aes(x = value)) + geom_bar() + 
    facet_wrap(~key, scales = 'free') + 
    theme_bw() + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) 

enter image description here

Leider kostenlos Waage und coord_flip nicht schön spielen. Sie können entweder geom_barh von the ggstance package verwenden. Oder Sie können lapply für jede Spalte verwenden, um eine Liste von ggplot Objekten zu erhalten und das cowplot-Paket verwenden, um sie in einer Figur zusammenzufassen.

+0

danke! das ist hilfreich –

+0

Es kam mir gerade in den Sinn, dass 'lapply' auch ein Weg wäre, vielleicht einfacher zusammen mit' coord_flip' zu spielen @ Axeman –

1

Vielleicht weniger elegant als @Axeman, sondern auch arbeiten und mit coord_flip kooperiert:

library(gridExtra) 


gg_bar <- function(x, ...){ 
    { 
    ggplot(data_frame(x), aes(x = x)) + 
     geom_bar() + 
     coord_flip() 
    } 
} 

diamonds %>% 
    select_if(negate(is.numeric)) %>% 
    lapply(., function(x) gg_bar(x)) -> gg_bar_list 

do.call(grid.arrange, gg_bar_list) 

enter image description here

jedoch der Name der Variablen ("x") nicht angezeigt wird, ist das nicht zu schön.

+0

Siehe ['cowplot :: plot_grid'] (https: //cran.r-project .org/web/packages/cowplot/vignettes/introduction.html) anstelle von 'grid.arrange', um automatische Alignment- und Subplot-Annotationen durchzuführen. Sie können die Anmerkungen als variable Beschriftungen verwenden und nicht die y-Achsenbeschriftung anzeigen. – Axeman

Verwandte Themen