如何从同一个图上的单个文件中获取多年的Y轴数据?

时间:2011-01-10 00:39:45

标签: r graph plot ggplot2

我有三年的燃气表读数,我试图在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 个答案:

答案 0 :(得分:13)

没有必要按年将数据分成数据框;您可以非常轻松地使用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

答案 1 :(得分:7)

以下是与Prasad的ggplot示例(1)对应的图,这些示例使用格子中的xyplot完成。 (2)之后我们将展示如何使用动物园包中的xyplot.zoo进行操作,然后(3)我们将使用动态包经典图形工具的plot.zoo再次展示如何进行操作。

在每种情况下,我们还会显示基于xblocks的第4种风格。

首先让我们重复Prasad的设置:

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

第三种方法是在动物园中使用经典图形,我们使用上面计算的zzzpal

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