2013-08-10 17 views
38

Ho un file di sondaggio in cui riga sono domande di osservazione e di colonna.Grafico a barre raggruppato in ggplot

Ecco alcuni fake data assomigliano:

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 

Il mio obiettivo è quello di creare questo tipo di trama con ggplot2.

  • io assolutamente Non mi importa del colore, disegno ecc
  • La trama non corrisponde ai dati falsi

enter image description here

Ecco il mio falso dati:

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) 

Ma se io c Hoose Y come conteggio quindi mi trovo ad affrontare un problema relativo alla scelta della X e dei valori del gruppo ... Non so se riuscirò a fare senza usare reshape2 ... Sono anche stanco di usare la rimodella con la funzione fusione. Ma non capisco come usarlo ...

risposta

65

Per prima cosa è necessario ottenere i conteggi per ogni categoria, cioè quanti Beni e Merci e così via ci sono per ogni gruppo (Cibo, Musica, Persone). Ciò potrebbe essere fatto in questo modo:

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 

allora avete bisogno di creare una cornice di dati fuori di esso, si fondono e tracciarla:

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") 

E 'questo quello che stai dopo?

enter image description here

Per chiarire un po ', in ggplot multiple grouping bar hai avuto un frame di dati che si presentava così:

> 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 

Dal momento che si dispone di valori numerici nelle colonne 4-9, che in seguito sarebbe tracciata Sull'asse y, questo può essere facilmente trasformato con reshape e tracciato.

Per il nostro set di dati corrente, avevamo bisogno di qualcosa di simile, così abbiamo usato freq=table(col(raw), as.matrix(raw)) per ottenere questo:

> 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 

Provate a immaginare di avere Very.Bad, Bad, Good e così via, invece di X1PCE, X2PCE, X3PCE. Vedi la somiglianza? Ma prima dovevamo creare come struttura. Da qui il freq=table(col(raw), as.matrix(raw)).

+0

Ciao grazie, è esattamente quello che voglio. Grazie. Ho solo una domanda è anche possibile evitare ' 'raw = raw [, c (2,3,4)] freq = table (col (raw), as.matrix (raw))' e fa tutto con rimodellare? Perché ho avuto lo stesso tipo di problema http://stackoverflow.com/questions/17303573/ggplot-multiple-grouping-bar e in questo post ho usato solo la risagoma. Sono confuso su questo ... – S12000

+0

Beh, non ne sono sicuro.Il 'raw = raw [, c (2,3,4)]' esiste solo perché non ha senso includere l'indicatore di osservazione (poiché non si tracciano le singole osservazioni nella trama successiva). Pertanto, il conteggio è l'unica cosa che conta. Se puoi fare tutto con 'rimodella', non lo so. La mia ipotesi è che non puoi. – jakub

+0

Beh, in realtà, i dati in questo post corrente sono diversi in quanto non contengono i conteggi numerici. Dai uno sguardo alle colonne 4-9 nel frame dei dati dal post a cui stai collegando: contengono valori numerici, successivamente sciolti da Didzis per creare la variabile 'value' nel frame dei dati fuso. Non avevamo valori, quindi dovevamo prima crearli. Quindi 'freq = table (col (raw), as.matrix (raw))'. (Ho aggiunto una spiegazione più ampia alla fine della mia risposta). – jakub

Problemi correlati