web-dev-qa-db-fra.com

barplot utilisant ggplot2

J'ai un ensemble de données comme ceci:

cars    trucks  suvs
1          2    4
3          5    4
6          4    6
4          5    6
9          12   16

J'essaie de dessiner un graphique à barres pour ces données. Actuellement, je peux le faire avec barplot:

barplot(as.matrix(autos_data), main="Autos", 
         ylab= "Total",beside=TRUE, col=Rainbow(5))

Générer ce graphique:

Bar plot

Mes questions sont donc les suivantes: Puis-je utiliser ggplot2 pour dessiner un tel graphique? Plus précisément - comment utiliser faceting ou d'autres options pour scinder le graphique en jours de la semaine? Si oui, comment puis-je accomplir cela? De plus, comment utiliser facet pour produire une mise en page différente?

15
boyang

Cela a été demandé à plusieurs reprises auparavant. La réponse est que vous devez utiliser stat="identity" dans geom_bar pour dire à ggplot de ne pas résumer vos données.

dat <- read.table(text="
cars    trucks  suvs
1   2   4
3   5   4
6   4   6
4   5   6
9   12  16", header=TRUE, as.is=TRUE)
dat$day <- factor(c("Mo", "Tu", "We", "Th", "Fr"), 
             levels=c("Mo", "Tu", "We", "Th", "Fr"))

library(reshape2)
library(ggplot2)

mdat <- melt(dat, id.vars="day")
head(mdat)
ggplot(mdat, aes(variable, value, fill=day)) + 
  geom_bar(stat="identity", position="dodge")

enter image description here

32
Andrie

Voici avec tidyr:

Le plus gros problème ici est que vous devez convertir vos données dans un format ordonné. Je recommande fortement de lire R pour Data Science ( http://r4ds.had.co.nz/ ) pour que vous soyez prêt à utiliser des données ordonnées et ggplot.

En règle générale, une bonne règle est que si vous devez entrer plusieurs instances du même géom, il existe probablement une solution dans le format de vos données qui vous permettrait de tout mettre dans la fonction aes() au sein du niveau supérieur ggplot(). Dans ce cas, vous devez utiliser la gather() pour organiser vos données de manière appropriée.

library(tidyverse)

# I had some trouble recreating your data, so I just did it myself here
data <- tibble(type = letters[1:9], 
               repeat_1 = abs(rnorm(9)), repeat_2  
               =abs(rnorm(9)), 
               repeat_3 = abs(rnorm(9)))

data_gathered <- data %>%
  gather(repeat_number, value, 2:4)

ggplot(data_gathered, aes(x = type, y = value, fill = repeat_number)) +
geom_col(position = "dodge")

 enter image description here

0
Ben G