2011-01-10 50 views
5

Tôi có chỉ số đồng hồ đo gas trong ba năm mà tôi đang cố gắng vẽ đồ thị trong R, để làm nổi bật mức sử dụng hàng ngày thay đổi qua các tháng trong một năm và để so sánh mức sử dụng của các năm khác nhau.Cách lấy dữ liệu trục Y nhiều năm từ một tệp trên cùng một ô?

mẫu dữ liệu:

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 

tôi có thể tính toán việc sử dụng trung bình hàng ngày từ các bài đọc định kỳ, và vẽ toàn bộ dữ liệu qua nhiều năm như là một loạt dữ liệu duy nhất:

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

Nhưng Tôi không thể tìm ra cách để R tự động chia dữ liệu thành các khung khác nhau? cho mỗi năm, để tôi có thể vẽ các đường riêng biệt cho mỗi năm. Tôi có thể tự tạo các tệp đầu vào khác nhau chỉ với dữ liệu cho mỗi năm, nhưng nó không phù hợp và sẽ cần mã thay đổi mỗi năm.

Tôi chắc chắn đó là một câu hỏi đơn giản, nhưng tôi đã xem xét hướng dẫn sử dụng và không thể tìm ra.

Trả lời

13

Không cần chia dữ liệu thành các khung dữ liệu theo năm; bạn có thể sử dụng gói ggplot2 khá dễ dàng để phân biệt các ô theo năm. Trước tiên tôi sẽ tạo nên một số dữ liệu:

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

Tiếp theo, tôi sẽ thêm hai cột để A: DayOfYear đó là "ngày-số" trong năm nay, và GasDiff cột (giống như bạn nhưng tạo ra nhiều một cách dễ dàng, không có vòng):

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

Tiếp theo chúng ta sử dụng ggplot2 để âm mưu đầu tiên tất cả các năm một sau khi khác, nhưng với màu sắc khác nhau:

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

mang đến cho bạn điều này: alt text

Hoặc bạn có thể vẽ những năm khác nhau trong một mạng lưới dọc:

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

và bạn có được điều này: alt text

UPDATE: Cách thứ ba là vẽ tất cả các năm trên cùng một ô với các màu/điểm khác nhau, có thể hữu ích nếu bạn đang tìm kiếm các mẫu theo mùa (nhưng có vẻ xấu trong trường hợp của tôi vì tôi đã tạo ra dữ liệu ngẫu nhiên).

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

alt text

+0

Hãy thử ggsave(), như trong ggsave ("/ tmp/image.png", width = 5, height = 4, dpi = 72) - Tôi sử dụng tất cả thời gian trên máy Mac thay vì lưu dưới dạng PDF, chuyển đổi, tải lên, v.v. –

+0

@ Jeffrey Ah có tất nhiên, đó là cách để làm điều đó, cảm ơn vì đã chỉ ra! –

+0

@Prasad - nhanh chóng và hữu ích, mang lại cho tôi những gì tôi đang theo dõi. – jgc

6

Sau đây là các lô tương ứng với ví dụ ggplot Prasad của (1) sử dụng xong xyplot trong lưới. (2) Sau đó, chúng tôi trình bày cách thực hiện bằng cách sử dụng xyplot.zoo từ gói sở thú và sau đó (3) chúng tôi hiển thị cách thực hiện lại một lần nữa bằng cách sử dụng plot.zoo sử dụng các tiện ích đồ họa cổ điển của gói sở thú.

Trong mỗi trường hợp này, chúng tôi cũng hiển thị kiểu thứ 4 dựa trên xblocks.

Đầu tiên cho phép lặp lại thiết lập Prasad của:

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

Bây giờ cho phép thử sử dụng mạng

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

Điều này cho phép những 4 lô:

alt text

và bây giờ cho phép lặp lại điều này sử dụng sử dụng sở thú kết hợp với mạng và các p khác 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() 

Đây là kết quả:

alt text

Một tập thứ ba cách là sử dụng đồ họa cổ điển với sở thú nơi mà chúng tôi sử dụng cùng một z, zzpal tính trên:

library(zoo) 
library(RColorBrewer) # brewer.pal 

png("png3a.png") 
plot(do.call("merge", split(z, year)), screen = 1, col = 1:3) 
dev.off() 
png("png3b.png") 
plot(na.approx(zz, na.rm = FALSE)) 
dev.off() 
png("png3c.png") 
plot(na.approx(zz, na.rm = FALSE), screen = 1, col = 1:3) 
legend("topleft", colnames(zz), lty = 1, col = 1:3, bty = "n") 
dev.off() 
png("png3d.png") 
plot(z, type = "n") 
xblocks(time(z), pal[factor(year)]) 
lines(z) 
dev.off() 

và đây là đầu ra

alt text

alt text

alt text

alt text

+0

Cảm ơn, @ G.G, đó là rất nhiều cách mới để cải thiện sản lượng biểu đồ của tôi. Đột nhiên các mạng lưới vv dường như không quá khó khăn. – jgc

+0

+1 wow minh họa đẹp về phương pháp vẽ nhiều âm mưu! –

+0

G, không nên trên na.approx (zz) là na.approx (zz, na.rm = FALSE)? –

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