2011-10-03 1 views
16

Sto provando a tracciare i dati meteorologici orari provenienti da una stazione meteorologica con ggplot2 (è la mia prima volta con ggplot). Sono riuscito a tracciare dati giornalieri, ma ho qualche problema nel ridimensionamento dei dati orari. I file di dati sembrano che:R ggplot2 che traccia i dati orari

FECHA H_SOLAR;DIR_M;VEL_M;TEMP_M;HR;PRECIP 
01/06/14 00:50:00;314.3;1.9;14.1;68.0;-99.9 
01/06/14 01:50:00;322.0;1.6;13.3;68.9;-99.9 
01/06/14 02:50:00;303.5;2.1;12.3;70.9;-99.9 
01/06/14 03:50:00;302.4;1.6;11.6;73.1;-99.9 
01/06/14 04:50:00;306.5;1.2;10.9;76.4;-99.9 
01/06/14 05:50:00;317.1;0.8;12.6;71.5;-99.9 
01/06/14 06:50:00;341.8;0.0;17.1;58.8;-99.9 
01/06/14 07:50:00;264.6;1.2;21.8;44.9;-99.9 
01/06/14 08:50:00;253.8;2.9;24.7;32.2;-99.9 
01/06/14 09:50:00;254.6;3.7;26.7;27.7;-99.9 
01/06/14 10:50:00;250.7;4.3;28.3;24.9;-99.9 
01/06/14 11:50:00;248.5;5.3;29.1;22.6;-99.9 
01/06/14 12:50:00;242.8;4.7;30.3;20.4;-99.9 
01/06/14 13:50:00;260.7;4.9;31.3;17.4;-99.9 
01/06/14 14:50:00;251.8;5.1;31.9;17.1;-99.9 
01/06/14 15:50:00;258.1;4.6;32.4;15.3;-99.9 
01/06/14 16:50:00;254.3;5.7;32.4;14.0;-99.9 
01/06/14 17:50:00;252.5;4.6;32.0;14.1;-99.9 
01/06/14 18:50:00;257.4;3.8;31.1;14.9;-99.9 
01/06/14 19:50:00;135.8;4.2;26.0;41.2;-99.9 
01/06/14 20:50:00;126.0;1.7;23.5;48.7;-99.9 
01/06/14 21:50:00;302.8;0.7;21.6;53.9;-99.9 
01/06/14 22:50:00;294.2;1.1;19.3;67.4;-99.9 
01/06/14 23:50:00;308.5;1.0;17.5;72.4;-99.9 

ho usato comanda questa R per tracciare i dati:

datos=read.csv("utiel.dat",sep=";",header=T,na.strings="-99.9") 

dia=as.Date(datos[,1],"%y/%m/%d")  # Crear índice dia 
veloc=zoo(datos[,c("VEL_M")],dia)  

gveloc=ggplot(data=datos,aes(dia,veloc)) 

gveloc + geom_point(colour="blue",cex=1) + ylab("Velocidad (km/h)") + xlab("Fecha") + opts(title="Velocidad media horaria") + scale_x_date(limits = as.Date(c("2007-01-01","2007-01-31")),format = "%Y-%m-%d") 

e ottenuto questo grafico mensile con tutti i dati da un solo giorno nella stessa coordinata x (vale a dire lo stesso giorno, come ci si poteva aspettare)

Hourly wind data with ggplot2

come posso gestire a leggere non solo il giorno ma il tempo in modo che ogni punto può essere tracciata nella sua propria coordinata x/tempo? Credo che il problema inizia prima della stampa, ma non sono riuscito a trovare il modo di leggere data AA/MM/DD H: M: S

Grazie in anticipo

Soluzione: Basta un'aggiunta di mettere il codice ha funzionato per me

datos$dia=as.POSIXct(datos[,1], format="%y/%m/%d %H:%M:%S") # Read date/time as POSIXct 

ggplot(data=datos,aes(x=dia, y=TEMP_M)) + 
    geom_point(colour="red") + 
    ylab("Temperatura (ºC)") + 
    xlab("Fecha") + 
    opts(title="Temperatura media") + 
    scale_x_datetime(limits=c(as.POSIXct('2008/02/01'), as.POSIXct('2008/02/02')) ,format = "%Y-%m-%d") 

Speranza che aiuta qualcun altro, grazie Andrie e G.Grothendieck

+0

Ciao, non riesco a vedere il tuo completo – pacomet

risposta

11

as.Date catturare solo l'elemento data. Per catturare il tempo, è necessario utilizzare as.POSIXct:

Ricrea i tuoi dati:

zz <- tempfile() 
cat(" 
FECHA H_SOLAR;DIR_M;VEL_M;TEMP_M;HR;PRECIP 
01/06/14 00:50:00;314.3;1.9;14.1;68.0;-99.9 
01/06/14 01:50:00;322.0;1.6;13.3;68.9;-99.9 
01/06/14 02:50:00;303.5;2.1;12.3;70.9;-99.9 
01/06/14 03:50:00;302.4;1.6;11.6;73.1;-99.9 
01/06/14 04:50:00;306.5;1.2;10.9;76.4;-99.9 
01/06/14 05:50:00;317.1;0.8;12.6;71.5;-99.9 
01/06/14 06:50:00;341.8;0.0;17.1;58.8;-99.9 
01/06/14 07:50:00;264.6;1.2;21.8;44.9;-99.9 
01/06/14 08:50:00;253.8;2.9;24.7;32.2;-99.9 
01/06/14 09:50:00;254.6;3.7;26.7;27.7;-99.9 
01/06/14 10:50:00;250.7;4.3;28.3;24.9;-99.9 
01/06/14 11:50:00;248.5;5.3;29.1;22.6;-99.9 
01/06/14 12:50:00;242.8;4.7;30.3;20.4;-99.9 
01/06/14 13:50:00;260.7;4.9;31.3;17.4;-99.9 
01/06/14 14:50:00;251.8;5.1;31.9;17.1;-99.9 
01/06/14 15:50:00;258.1;4.6;32.4;15.3;-99.9 
01/06/14 16:50:00;254.3;5.7;32.4;14.0;-99.9 
01/06/14 17:50:00;252.5;4.6;32.0;14.1;-99.9 
01/06/14 18:50:00;257.4;3.8;31.1;14.9;-99.9 
01/06/14 19:50:00;135.8;4.2;26.0;41.2;-99.9 
01/06/14 20:50:00;126.0;1.7;23.5;48.7;-99.9 
01/06/14 21:50:00;302.8;0.7;21.6;53.9;-99.9 
01/06/14 22:50:00;294.2;1.1;19.3;67.4;-99.9 
01/06/14 23:50:00;308.5;1.0;17.5;72.4;-99.9 
", file=zz) 

datos=read.csv(zz, sep=";", header=TRUE, na.strings="-99.9") 

convertire le date per POSIXct e stampare:

library(ggplot2) 

datos=read.csv(zz, sep=";", header=TRUE, na.strings="-99.9") 

datos$dia=as.POSIXct(datos[,1], format="%y/%m/%d %H:%M:%S") 

ggplot(data=datos,aes(x=dia, y=TEMP_M)) + 
    geom_path(colour="red") + 
    ylab("Temperatura (ºC)") + 
    xlab("Fecha") + 
    opts(title="Temperatura media") 

enter image description here

+0

Bella risposta Andrie, grazie. Funziona bene con i dati giornalieri che ho postato, ma il punto è che i miei dati si estendono per dieci anni. Quindi ho bisogno di impostare l'opzione set_x_scale per scegliere il periodo di tempo che voglio tracciare (da un giorno all'altro). Non sono in grado di riprodurre il grafico per un mese. È necessario ricreare i dati? – pacomet

+0

Dovrai specificare i limiti della scala anche come date 'POSIXct', non' come Date'. – Andrie

+0

Come devo impostare i limiti come POSIXct? Forse qualcosa del tipo: 'scale_x_date (limits = as.POSIXct (c (" 2004-01-01 "," 2005-01-01 ")), format ="% Y-% m-% d ")' ?? Grazie – pacomet

6

Dal momento che si sta utilizzando zoo siamo possibile utilizzare read.zoo per impostare i dati, z e quindi tracciarlo utilizzando plot.zoo, xyplot.zoo o ggplot2's qplot. Mostriamo tutti e tre di seguito.

Lines <- "FECHA H_SOLAR;DIR_M;VEL_M;TEMP_M;HR;PRECIP 
01/06/14 00:50:00;314.3;1.9;14.1;68.0;-99.9 
01/06/14 01:50:00;322.0;1.6;13.3;68.9;-99.9 
01/06/14 02:50:00;303.5;2.1;12.3;70.9;-99.9 
01/06/14 03:50:00;302.4;1.6;11.6;73.1;-99.9 
01/06/14 04:50:00;306.5;1.2;10.9;76.4;-99.9 
01/06/14 05:50:00;317.1;0.8;12.6;71.5;-99.9 
01/06/14 06:50:00;341.8;0.0;17.1;58.8;-99.9 
01/06/14 07:50:00;264.6;1.2;21.8;44.9;-99.9 
01/06/14 08:50:00;253.8;2.9;24.7;32.2;-99.9 
01/06/14 09:50:00;254.6;3.7;26.7;27.7;-99.9 
01/06/14 10:50:00;250.7;4.3;28.3;24.9;-99.9 
01/06/14 11:50:00;248.5;5.3;29.1;22.6;-99.9 
01/06/14 12:50:00;242.8;4.7;30.3;20.4;-99.9 
01/06/14 13:50:00;260.7;4.9;31.3;17.4;-99.9 
01/06/14 14:50:00;251.8;5.1;31.9;17.1;-99.9 
01/06/14 15:50:00;258.1;4.6;32.4;15.3;-99.9 
01/06/14 16:50:00;254.3;5.7;32.4;14.0;-99.9 
01/06/14 17:50:00;252.5;4.6;32.0;14.1;-99.9 
01/06/14 18:50:00;257.4;3.8;31.1;14.9;-99.9 
01/06/14 19:50:00;135.8;4.2;26.0;41.2;-99.9 
01/06/14 20:50:00;126.0;1.7;23.5;48.7;-99.9 
01/06/14 21:50:00;302.8;0.7;21.6;53.9;-99.9 
01/06/14 22:50:00;294.2;1.1;19.3;67.4;-99.9 
01/06/14 23:50:00;308.5;1.0;17.5;72.4;-99.9" 
cat(Lines, "\n", file = "data.txt") 

library(zoo) 
z <- read.zoo("data.txt", header = TRUE, sep = ";", na.strings = "-99.9", 
     tz = "", format = "%y/%m/%d %H:%M:%S") 
# move last 12 points into following day 
time(z)[13:24] <- time(z)[13:24] + 24 * 60 * 60 
xlim <- as.POSIXct(c("2001-06-14 00:00:00", "2001-06-14 12:00:00")) 

Qui ci sono i 3 modi per tracciare esso:

1 - grafica classica utilizzando plot.zoo:

# Create manual axis since classic graphic's default is not so good. 
# Axis might be ok for real data in which case manual axis setting can be omitted 
plot(z$VEL_M, type = "p", xlab = "X", ylab = "Y", col = "blue", xlim = xlim, 
    xaxt = "n") 
xaxis <- seq(xlim[1], xlim[2], by = "hour") 
axis(1, xaxis, as.POSIXlt(xaxis)$hour) 

2 - grafica reticolo utilizzando xyplot.zoo:

library(lattice) 
xyplot(z$VEL_M, type = "p", xlab = "X", ylab = "Y", col = "blue", xlim = xlim) 
.210

3 - ggplot2 usando qplot:

# unlike classic graphics and lattice graphics, zoo currently 
# does not have a specific interface but we can do this: 
library(ggplot2) 
qplot(time(z), z$VEL_M, xlab = "X", ylab = "Y") + 
    geom_point(colour = "blue") + 
    scale_x_datetime(limits = xlim) 

EDIT:

hanno modificato esempio per illustrare limitare l'asse X.

+0

Ciao e grazie per la tua risposta. Ho provato l'opzione ggplot2 e funziona bene per l'intero set di dati, ma non riesco a creare l'immagine quando provo a impostare i limiti dell'asse x. Provo 'scale_x_date (limits = as.Date (c (" 2007-01-01 "," 2007-01-31 ")), format ="% Y-% m-% d ")' e quindi non appare alcun punto , i limiti x sono ben definiti ma qualsiasi dato. R dice "Rimosse 105192 righe contenenti valori mancanti (geom_point)". Qualche idea? – pacomet

+0

Ciao di nuovo. Ho accettato l'altra risposta in quanto mi ha aiutato a capire il formato di data e ora POSIXct, acquistare il tuo è stato anche utile. – pacomet

+1

@pacomet. Ho modificato l'esempio per illustrare la limitazione dell'asse X. –