2015-02-17 15 views
6

Sto leggendo il libro di Hadley Wickham su ggplot, ma ho difficoltà a tracciare determinati pesi nel tempo in un grafico a barre. Ecco dati di esempio:ggplot grafico a barre per le serie temporali

dates <- c("20040101","20050101","20060101") 
dates.f <- strptime(dates,format="%Y%m%d") 

m <- rbind(c(0.2,0.5,0.15,0.1,0.05),c(0.5,0.1,0.1,0.2,0.1),c(0.2,0.2,0.2,0.2,0.2)) 
m <- cbind(dates.f,as.data.frame(m)) 

Questo data.frame trovi nella prima colonna le date e ciascuna riga i pesi corrispondenti. Vorrei tracciare i pesi per ogni anno in un grafico a barre usando l'argomento "riempimento".

sono in grado di tracciare i pesi come bar utilizzando:

p <- ggplot(m,aes(dates.f)) 
p+geom_bar() 

Tuttavia, questo non è esattamente quello che voglio. Mi piacerebbe vedere in ogni barra il contributo di ciascun peso. Inoltre, non capisco perché ho lo strano formato sull'asse x, cioè perché sono visualizzati "2004-07" e "2005-07".

Grazie per l'aiuto

risposta

3

Spero che questo è quello che stai cercando:

ggplot2 richiede dati in un formato lungo.

require(reshape2) 
m_molten <- melt(m, "dates.f") 

Tracciando si è fatto da

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
    geom_bar(stat="identity") 

enter image description here

È possibile aggiungere position="dodge" a geom_bar se si vuole poi fianco a fianco.

EDIT

Se desideri solo pause annuali: convertire m_molten$dates.f fino ad oggi.

require(scales) 
m_molten$dates.f <- as.Date(m_molten$dates.f) 

ggplot(m_molten, aes(x=dates.f, y=value, fill=variable)) + 
    geom_bar(stat="identity") + 
    scale_x_date(labels = date_format("%y"), breaks = date_breaks("year")) 

P.S .: Vedere http://vita.had.co.nz/papers/tidy-data.pdf per la filosofia di Hadley dei dati ordinati.

+0

esattamente! grazie molto! – math

+0

forse una piccola domanda: volevo cambiare le etichette tramite 'scale_x_date (lables = date_format ("% y "))'. Questo è un errore che non può trovare la funzione date_format. Come posso visualizzare solo 04, 05,06? – math

+0

vedi modifica sopra. – Rentrop

1

Per creare la trama necessaria, è necessario rimodellare i dati da "ampio" a "alto". Esistono molti modi per farlo, compresa la funzione reshape() nella base R (non consigliata), reshape2 e tidyr.

Nel pacchetto tidyr si dispone di due funzioni per risagomare dati, gather() e spread().

La funzione gather() si trasforma da larga a alta. In questo caso, devi raccogliere le tue colonne V1:V5.

Prova questa:

library("tidyr") 

tidy_m <- gather(m, var, value, V1:V5) 

ggplot(tidy_m,aes(x = dates.f, y=value, fill=var)) + 
    geom_bar(stat="identity") 

enter image description here

Problemi correlati