2017-10-02 3 views
0

Supposons que nous ayons un ensemble de produits (pommes, bananes, pommes de terre, etc.) répartis sur différents continents. Nous visualisons leur distribution sur les continents via des histogrammes à facettes dans le package ggplot2, et ces marchandises (appelées dans ce qui suit le champ "stuff") agissent comme des facteurs à afficher sur l'axe x. Chaque continent a son propre ensemble de choses, comme indiqué dans les données, bien que certaines marchandises peuvent être communes (bananes) sur deux continents ou plus. Voici l'exemple de données en format court. Les champs "moyen" et "géant" subdivisent en outre le marché en séparant les choses en moyennes et grandes tailles (à tracer avec des couleurs différentes).R: dessiner un ensemble unique de facteurs pour chaque facette dans ggplot2 barchart

data<-read.csv(text="continent,stuff,average,giant 
North America,apples,20,30 
North America,bananas,25,32 
Europe,bananas,15,25 
Europe,potatoes,10,20 
Europe,mosquitoes,13,17 
Asia,snakes,26,35 
Asia,snails,7,15 
Asia,pandas,10,20") 

Tout d'abord nous réduisons les données au format long, et à côté graphique via geom_col() et technique de facettage:

library(dplyr) 
library(tidyr) 
library(ggplot2) 
data.tidied<-data %>% 
    gather(key=size, value=val,-continent,-stuff) 
ggplot(data.tidied,aes(x=stuff,y=val,fill=size))+ 
geom_col(position="dodge")+ 
facet_grid(~continent)+coord_flip() 

barchart with shared factors across facets

Tous les facteurs les choses sont alignés sur tous les continents, bien que la plupart d'entre eux ne sont pas nécessaires, il y a donc beaucoup de lacunes. Mais nous n'avons pas besoin d'escargots en Amérique du Nord et en Europe, il est naturel d'avoir ce champ uniquement pour l'Asie et ainsi de suite. (Pour clarifier les choses, vous pouvez penser aux pommes/bananes/pommes de terre comme certaines localités géographiques, uniques pour un continent: nous n'avons pas de Californie en Europe). Alors: comment afficher cette situation en utilisant néanmoins la technique de facettage de ggplot (ou toute alternative)? C'est: comment dessiner un ensemble unique de facteurs pour chaque facette?

Répondre

2

Vous pouvez utiliser facet_wrap au lieu de facet_grid et spécifier scales = "free_y" (doit être free_y lorsque vous avez inversé les axes). Mais cela rend les tableaux un peu bizarres, à mon avis.

data %>% 
    gather(size, val, -continent, -stuff) %>% 
    ggplot(aes(stuff, val)) + 
    geom_col(aes(fill = size), position = "dodge") + 
    facet_wrap(~continent, scales = "free_y") + 
    coord_flip() 

enter image description here