2011-10-03 40 views
16

Tôi đang cố vẽ các dữ liệu khí tượng theo giờ đến từ trạm khí tượng với ggplot2 (đây là lần đầu tiên tôi có ggplot). Tôi đã quản lý để vẽ dữ liệu hàng ngày nhưng có một số vấn đề khi downscaling để dữ liệu hàng giờ. tập tin dữ liệu trông giống như rằng:R ggplot2 vẽ dữ liệu theo giờ

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 

Tôi đã sử dụng R này lệnh để vẽ đồ thị dữ liệu:

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

và có biểu đồ hàng tháng này với tất cả dữ liệu từ một ngày duy nhất trong cùng một tọa độ x (ví dụ: cùng ngày vì nó có thể được dự kiến)

Hourly wind data with ggplot2

làm thế nào tôi có thể quản lý để đọc không chỉ là ngày nhưng thời gian vì vậy mỗi điểm có thể được vẽ trong nó riêng x/thời gian phối hợp? Tôi nghĩ rằng vấn đề bắt đầu trước khi âm mưu nhưng tôi không thể tìm thấy cách đọc ngày như YY/MM/DD H: M: S

Cảm ơn trước

Giải pháp: Chỉ cần một sự bổ sung để đặt mã đã làm việc đối với tôi

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

Hy vọng nó sẽ giúp người khác, nhờ Andrie và G.Grothendieck

+0

Xin chào, tôi không thể nhìn thấy toàn bộ lời chào của bạn – pacomet

Trả lời

11

as.Date chỉ nắm bắt những yếu tố ngày. Để nắm bắt thời gian, bạn cần phải sử dụng as.POSIXct:

Tái dữ liệu của bạn:

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

Chuyển đổi ngày để POSIXct và in:

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

Câu trả lời hay, Andrie, cảm ơn. Nó hoạt động tốt với các dữ liệu hàng ngày tôi đăng nhưng điểm là dữ liệu của tôi kéo dài trong mười năm. Sau đó, tôi cần phải thiết lập tùy chọn set_x_scale để chọn khoảng thời gian tôi muốn vẽ (ngày này sang tháng khác). Tôi không thể tạo lại biểu đồ trong một tháng. Có cần phải tạo lại dữ liệu không? – pacomet

+0

Bạn sẽ phải chỉ định giới hạn của mình cho thang đo cũng như ngày 'POSIXct', không phải là' ngày tháng '. – Andrie

+0

Tôi nên đặt giới hạn như POSIXct như thế nào? Có thể một cái gì đó như: 'scale_x_date (limits = as.POSIXct (c (" 2004-01-01 "," 2005-01-01 ")), format ="% Y-% m-% d ")' ?? Cảm ơn – pacomet

6

Vì bạn đang sử dụng vườn thú chúng tôi có thể sử dụng read.zoo để thiết lập dữ liệu, z và sau đó vẽ nó bằng cách sử dụng plot.zoo, xyplot.zoo hoặc ggplot2's qplot. Chúng tôi hiển thị tất cả ba bên dưới.

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

Dưới đây là 3 cách để vẽ nó:

1 - đồ họa cổ điển sử dụng 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 - đồ họa mạng sử dụng xyplot.zoo:

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

3 - ggplot2 sử dụng 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:

đã sửa đổi ví dụ để minh họa cho việc hạn chế trục X.

+0

Xin chào và cảm ơn câu trả lời của bạn. Tôi đã thử các tùy chọn ggplot2 và hoạt động tốt cho toàn bộ tập dữ liệu nhưng tôi không thể làm cho đồ họa khi cố gắng thiết lập giới hạn trục x. Tôi thử 'scale_x_date (limits = as.Date (c (" 2007-01-01 "," 2007-01-31 ")), format ="% Y-% m-% d ")' và sau đó không xuất hiện điểm nào , giới hạn x được xác định rõ nhưng bất kỳ dữ liệu nào. R nói rằng "Đã xóa 105192 hàng chứa giá trị thiếu (geom_point)". Bất kỳ ý tưởng? – pacomet

+0

Xin chào một lần nữa. Tôi đã chấp nhận câu trả lời khác vì nó đã giúp tôi hiểu về định dạng ngày và giờ POSIXct mua của bạn nó cũng hữu ích. – pacomet

+1

@pacomet. Đã sửa đổi ví dụ để minh họa giới hạn trục X. –

Các vấn đề liên quan