2011-01-10 8 views
5

Ho letture del contatore di gas per tre anni che sto cercando di rappresentare in R, per evidenziare il cambiamento dell'utilizzo quotidiano nei mesi in un anno e per confrontare l'utilizzo di anni diversi.Come ottenere più anni dati sull'asse Y da un singolo file sullo stesso grafico?

campione dei dati:

Date,Gas 
02/01/2010,4460.9 
13/01/2010,4543 
04/02/2010,4656 
16/02/2010,4733 
07/03/2010,4842 
26/03/2010,4933.8 

posso calcolare l'utilizzo medio giornaliero dalle letture periodiche, e tracciare l'insieme dei dati attraverso diversi anni come una singola serie di dati:

A <- read.table("energy.csv", header=TRUE, fill=TRUE, sep=',') 
A$Dates <- as.Date(A$Date, format="%d/%m/%Y") 
for (j in 2:length(A$Gas)) { 
    A$GasDiff[j-1] = A$Gas[j] - A$Gas[j-1] 
} 
plot(A$Dates, A$GasDiff, type="o", lty=1, pch=20, ylab="Daily Consumption", 
    main="Gas Consumption") 

Ma Non riesco a capire come ottenere R per dividere automaticamente i dati in diversi? per ogni anno, in modo da poter tracciare linee separate per ogni anno. Posso creare manualmente diversi file di input con solo i dati per ogni anno, ma è inelegante e il codice verrà modificato ogni anno.

Sono sicuro che è una domanda semplice, ma ho guardato i manuali e non riesco a capirlo.

risposta

13

Non è necessario dividere i dati in frame di dati per anno; è possibile utilizzare il pacchetto ggplot2 abbastanza facilmente per differenziare i grafici per anno. Prima farò un po 'di dati:

dts <- as.Date("20050101", '%Y%m%d') + seq(0,1000,15) 
A <- data.frame(Dates = dts, Gas = 4000 + cumsum(abs(rnorm(length(dts), 100, 30)))) 

successiva sarò aggiungere due colonne per A: DayOfYear che è il "giorno-numero" entro l'anno, e la colonna GasDiff (uguali ai suoi, ma ha generato più facilmente, con nessun cicli):!

A <- transform(A,    
       Year = format(Dates, '%Y'), 
       DayOfYear = as.numeric(format(Dates, '%j')), 
       GasDiff = c(diff(Gas),NA)) 

successivo usiamo ggplot2 al primo lotto tutti gli anni uno dopo l'altro, ma con colori diversi:

require(ggplot2) 
ggplot(A, aes(Dates, GasDiff)) + geom_line(aes(colour = Year)) 

che ti dà questo: alt text

In alternativa è possibile tracciare i diversi anni in una griglia verticale:

ggplot(A, aes(DayOfYear, GasDiff)) + geom_line() + facet_grid(Year ~ .) 

e si ottiene questo: alt text

UPDATE: Un terzo modo è di tracciare tutti gli anni sulla stessa trama con diversi colori/punti, che possono essere utili se cerchi modelli stagionali (ma nel mio caso mi sembra male perché ho inventato dati casuali).

ggplot(A, aes(DayOfYear, GasDiff)) + 
    geom_line(aes(colour = Year)) + 
    geom_point(aes(shape = Year)) 

alt text

+0

Try ggsave(), come in ggsave ("/ tmp/immagine.png", width = 5, height = 4, dpi = 72) - Io lo uso sempre sul mio Mac invece di salvare come PDF, convertire, caricare, ecc. –

+0

@Jeffrey Ah sì certo, questo è il modo di farlo, grazie per averlo fatto notare! –

+0

@Prasad: è stato rapido e utile, dandomi quello che sto cercando. – jgc

6

Ecco le trame corrispondenti agli esempi ggplot di Prasad (1) fatto utilizzando xyplot in lattice. (2) Dopodiché mostriamo come farlo usando xyplot.zoo dal pacchetto zoo e poi (3) mostriamo come eseguirne ognuna ancora usando lo plot.zoo che usa le classiche funzionalità grafiche del pacchetto zoo.

In ognuno di questi casi viene anche visualizzato un quarto stile basato su xblocks.

primo luogo permette di ripetere l'installazione di Prasad:

dts <- as.Date("20050101", '%Y%m%d') + seq(0,1000,15) 
A <- data.frame(Dates = dts, Gas = 4000 + cumsum(abs(rnorm(length(dts), 100, 30)))) 

A <- transform(A,    
       Year = format(Dates, '%Y'), 
       DayOfYear = as.numeric(format(Dates, '%j')), 
       GasDiff = c(diff(Gas),NA)) 

Ora proviamo utilizzando lattice

library(lattice) # xyplot 
library(latticeExtra) # layer_, panel.xblocks 
library(gridExtra) # grid.arrange 
library(RColorBrewer) # brewer.pal 

png("png1.png") 
p1 <- xyplot(GasDiff ~ Dates, group = Year, A, type = "l", 
    par.settings = list(superpose.line = list(col = 1:nlevels(A$Year))), 
    auto.key = list(lines = TRUE, points = FALSE)) 

p2 <- xyplot(GasDiff ~ DayOfYear | Year, A, type = "l", layout = c(1, 3)) 

p3 <- xyplot(GasDiff ~ DayOfYear, A, group = Year, type = "l", 
    auto.key = list(lines = TRUE, points = FALSE)) 

# and here is another style: 

myPalette <- brewer.pal(nlevels(A$Year), "Set3") 
p4 <- xyplot(GasDiff ~ Dates, A, type = "l", col = 1) + 
    layer_(panel.xblocks(A$Dates, myPalette[A$Year])) 

grid.arrange(nrow = 2, p1, p2, p3, p4) 
dev.off() 

Questo dà questi 4 piazzole:

alt text

e ora lascia ripetere questo utilizzando usando lo zoo in congiunzione con il reticolo e l'altro p ackages:

png("png2.png") 
library(zoo) 
library(lattice) 
library(latticeExtra) # layer_, panel.xblocks 
library(gridExtra) # grid.arrange 
library(RColorBrewer) # brewer.pal 

z <- with(A, zoo(GasDiff, Dates)) 
year <- format(time(z), "%Y") 

# split years into separate columns and plot 
P1 <- xyplot(do.call("merge", split(z, year)), screen = 1, col = 1:3) 

# split years into separate columns and use day.of.year as time 
day.of.year <- function(x) as.numeric(format(x, "%j")) 
zz <- read.zoo(A[c(1, 5, 3)], FUN = day.of.year, split = 3) 
colnames(zz) <- unique(year) 
P2 <- xyplot(na.approx(zz, na.rm = FALSE)) 

P3 <- xyplot(na.approx(zz, na.rm = FALSE), screen = 1, col = 1:3, auto.key = TRUE) 

pal <- brewer.pal(nlevels(factor(year)), "Set3") 
P4 <- xyplot(z, screen = 1) + layer_(panel.xblocks(time(z), pal[factor(year)])) 

grid.arrange(nrow = 2, P1, P2, P3, P4) 
dev.off() 

Ecco l'output:

alt text

Una terza serie di modi è quello di utilizzare la grafica in stile classico con zoo dove usiamo la stessa z, zz e pal calcolato sopra:

e qui è l'uscita

alt text

alt text

alt text

alt text

+0

Grazie, @ G.G, ci sono molti nuovi modi per migliorare il mio output grafico. All'improvviso i reticoli ecc. Non sembrano così scoraggianti. – jgc

+0

+1 wow bella illustrazione del metodo di plottaggio multiplo! –

+0

G, non dovrebbe sopra na.approx (zz) essere na.approx (zz, na.rm = FALSE)? –

Problemi correlati