web-dev-qa-db-fra.com

Barre de parc groupée dans ggplot

J'ai un fichier d'enquête dans lequel la ligne est l'observation et la question de la colonne.

Voici quelques fausses données elles ressemblent à:

People,Food,Music,People
P1,Very Bad,Bad,Good
P2,Good,Good,Very Bad
P3,Good,Bad,Good
P4,Good,Very Bad,Very Good
P5,Bad,Good,Very Good
P6,Bad,Good,Very Good

Mon but est de créer ce genre d’intrigue avec ggplot2.

  • Je ne m'occupe absolument pas des couleurs, du design, etc.
  • L'intrigue ne correspond pas aux fausses données

enter image description here

Voici mes fausses données:

raw <- read.csv("http://Pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)

Mais si je choisis Y en tant que compte, alors je suis confronté à un problème concernant le choix de X et les valeurs du groupe ... Je ne sais pas si je peux réussir sans utiliser reshape2... Je suis aussi fatigué d'utiliser reshape avec la fonction de fusion. Mais je ne comprends pas comment l'utiliser ...

43
S12000

Vous devez d’abord obtenir les chiffres de chaque catégorie, c’est-à-dire le nombre de torts et de biens et ainsi de suite pour chaque groupe (aliments, musique, personnes). Cela se ferait comme suit:

raw <- read.csv("http://Pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)

raw=raw[,c(2,3,4)] # getting rid of the "people" variable as I see no use for it

freq=table(col(raw), as.matrix(raw)) # get the counts of each factor level

Ensuite, vous devez créer un bloc de données, le fondre et le tracer:

Names=c("Food","Music","People")     # create list of names
data=data.frame(cbind(freq),Names)   # combine them into a data frame
data=data[,c(5,3,1,2,4)]             # sort columns

# melt the data frame for plotting
data.m <- melt(data, id.vars='Names')

# plot everything
ggplot(data.m, aes(Names, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat="identity")

Est-ce ce que vous recherchez?

enter image description here

Pour clarifier un peu, dans barre de regroupement multiple de ggplot vous aviez un cadre de données qui ressemblait à ceci:

> head(df)
  ID Type Annee X1PCE X2PCE X3PCE X4PCE X5PCE X6PCE
1  1    A  1980   450   338   154    36    13     9
2  2    A  2000   288   407   212    54    16    23
3  3    A  2020   196   434   246    68    19    36
4  4    B  1980   111   326   441    90    21    11
5  5    B  2000    63   298   443   133    42    21
6  6    B  2020    36   257   462   162    55    30

Comme vous avez des valeurs numériques dans les colonnes 4 à 9, qui seront ensuite tracées sur l’axe des y, cela peut être facilement transformé avec reshape et tracé.

Pour notre ensemble de données actuel, nous avions besoin de quelque chose de similaire, nous avons donc utilisé freq=table(col(raw), as.matrix(raw)) pour obtenir ceci:

> data
   Names Very.Bad Bad Good Very.Good
1   Food        7   6    5         2
2  Music        5   5    7         3
3 People        6   3    7         4

Imaginez que vous ayez Very.Bad, Bad, Good et ainsi de suite au lieu de X1PCE, X2PCE, X3PCE. Voir la similitude? Mais nous avions besoin de créer une telle structure en premier. D'où la freq=table(col(raw), as.matrix(raw)).

81
jakub