我有三年的燃气表读数,我试图在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自动将数据拆分成不同的?帧?每年,我可以为每年绘制单独的行。我可以用每年的数据手动创建不同的输入文件,但它不够优雅,并且每年都需要更改代码。
我确信这是一个简单的问题,但我盯着手册,无法弄明白。
答案 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))
给你这个:
或者,您可以在垂直网格中绘制不同年份:
ggplot(A, aes(DayOfYear, GasDiff)) + geom_line( ) + facet_grid(Year ~ .)
你得到这个:
更新: 第三种方法是在不同颜色/点的同一地块上绘制所有年份,如果您正在寻找季节性模式,这可能很有用(但在我的情况下看起来很糟糕,因为我编写了随机数据。)
ggplot(A, aes(DayOfYear, GasDiff)) +
geom_line( aes(colour = Year) ) +
geom_point( aes(shape = Year))
答案 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个图:
现在让我们使用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()
这是输出:
第三种方法是在动物园中使用经典图形,我们使用上面计算的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()
这是输出