jgc*_*jgc 6 plot r graph 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
Run Code Online (Sandbox Code Playgroud)
我可以从周期性读数计算平均每日使用量,并将几年内的整个数据绘制为单个数据系列:
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")
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何让R自动将数据拆分成不同的帧?每年,我可以为每年绘制单独的行.我可以用每年的数据手动创建不同的输入文件,但它不够优雅,并且需要每年更改代码.
我确定这是一个简单的问题,但我盯着手册,无法弄清楚.
Pra*_*ani 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))))
Run Code Online (Sandbox Code Playgroud)
接下来我将添加两列A:DayOfYear这是一年中的"天数"和GasDiff列(与您的相同,但更容易生成,没有循环!):
A <- transform( A,
Year = format(Dates, '%Y'),
DayOfYear = as.numeric( format(Dates, '%j')),
GasDiff = c(diff( Gas ),NA))
Run Code Online (Sandbox Code Playgroud)
接下来我们ggplot2首先用一个接一个地绘制所有年份,但使用不同的颜色:
require(ggplot2)
ggplot(A, aes(Dates, GasDiff)) + geom_line( aes(colour = Year))
Run Code Online (Sandbox Code Playgroud)
这给你这个:

或者,您可以在垂直网格中绘制不同年份:
ggplot(A, aes(DayOfYear, GasDiff)) + geom_line( ) + facet_grid(Year ~ .)
Run Code Online (Sandbox Code Playgroud)
你得到这个:

更新:第三种方法是在不同颜色/点的同一图上绘制所有年份,如果您正在寻找季节性模式(但在我的情况下看起来很糟糕,因为我编写了随机数据),这可能很有用.
ggplot(A, aes(DayOfYear, GasDiff)) +
geom_line( aes(colour = Year) ) +
geom_point( aes(shape = Year))
Run Code Online (Sandbox Code Playgroud)

以下是与Prasad的ggplot示例(1)对应的图,这些示例xyplot在格子中使用.(2)之后我们将展示如何使用xyplot.zoozoo包进行操作,然后(3)我们plot.zoo将使用使用zoo包的经典图形工具再次展示如何使用它.
在这些案例中,我们还展示了基于的第四种风格xblocks.
首先让我们重复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))
Run Code Online (Sandbox Code Playgroud)
现在让我们尝试使用晶格
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()
Run Code Online (Sandbox Code Playgroud)
这给出了这4个图:

现在让我们使用动物园结合格子和其他包来重复这个:
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()
Run Code Online (Sandbox Code Playgroud)
这是输出:

第三种方法是使用经典图形与动物园,我们使用相同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()
Run Code Online (Sandbox Code Playgroud)
这是输出



