I am trying to plot hourly meteorological data coming from a meteorological station with ggplot2 (it's my first time with ggplot). I've managed to plot daily data but having some problem when downscaling to hourly data. Data files look like that:
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
I have used this R commands to plot the data:
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")
and got this monthly graph with all data from a single day in the same x coordinate (i.e. the same day as it could be expected)
How can I manage to read not only the day but the time so each point can be plotted in it's own x/time coordinate? I think the problem starts before plotting but I couldn't find how to read date as YY/MM/DD H:M:S
Thanks in advance
Solution: Just an addition to put the code has worked for 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")
Hope it helps someone else, thanks Andrie and G.Grothendieck
as.Date
only capture the date element. To capture time, you need to use as.POSIXct
:
Recreate your data:
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")
Convert dates to POSIXct
and print:
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")
Since you are using zoo we can use read.zoo
to set up the data, z
, and then plot it using plot.zoo
, xyplot.zoo
or ggplot2's qplot
. We show all three below.
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"))
Here are the 3 ways to plot it:
1 - classic graphics using 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 - lattice graphics using xyplot.zoo
:
library(lattice)
xyplot(z$VEL_M, type = "p", xlab = "X", ylab = "Y", col = "blue", xlim = xlim)
3 - ggplot2 using 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:
Have modified example in order to illustrate limiting the X axis.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With