Как получить данные за несколько лет по оси Y из одного файла на одном графике? - PullRequest
6 голосов
/ 10 января 2011

У меня есть показания счетчика газа за три года, которые я пытаюсь отобразить в R, чтобы выделить изменяющееся ежедневное использование по месяцам в году и сравнить использование разных лет.

Образец данных:

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  

Я могу рассчитать среднесуточное использование по периодическим показаниям и построить все данные за несколько лет в виде одного ряда данных:

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

Но я могуне понять, как получить R для автоматического разделения данных на разные? кадры?для каждого года, чтобы я мог построить отдельные линии для каждого года.Я могу вручную создавать разные входные файлы, содержащие только данные за каждый год, но это не элегантно, и мне нужно будет менять код каждый год.

Я уверен, что это простой вопрос, но я смотрел на руководстваи не могу понять.

Ответы [ 2 ]

13 голосов
/ 10 января 2011

Нет необходимости разбивать данные на фреймы по годам;Вы можете использовать пакет ggplot2 довольно просто, чтобы дифференцировать графики по годам.Сначала я составлю некоторые данные:

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: DayOfYear, который является "числом дня" в году, и GasDiffстолбец (такой же, как ваш, но сгенерированный легче, без петель !):

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

Далее мы используем ggplot2, чтобы сначала построить все годы один за другим, но сразные цвета:

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

, что дает вам это: alt text

В качестве альтернативы вы можете построить разные годы в вертикальной сетке:

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

и вы получитеэто: alt text

ОБНОВЛЕНИЕ: Третий способ - построить все годы на одном графике с разными цветами / точками, что может быть полезно, если выищут сезонные модели (но в моем случае выглядит плохо, потому что я составил случайные данные).

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

alt text

7 голосов
/ 10 января 2011

Вот графики, соответствующие примерам ggplot Прасада (1), выполненным с использованием xyplot в решетке. (2) После этого мы покажем, как это сделать, используя xyplot.zoo из пакета zoo, а затем (3) покажем, как сделать это еще раз, используя plot.zoo, который использует классические графические возможности пакета zoo.

В каждом из этих случаев мы также показываем 4-й стиль, основанный на xblocks.

Сначала давайте повторим настройку Прасада:

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

Теперь давайте попробуем использовать решетку

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

Это дает следующие 4 графика:

alt text

и теперь давайте повторим это, используя zoo вместе с решеткой и другими пакетами:

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

Вот вывод:

alt text

Третий набор способов - использовать классическую графику с зоопарком, где мы используем те же z, zz и pal, рассчитанные выше:

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

а вот и вывод

alt text

alt text

alt text

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...