从具有2个固定变量的数据框绘制

时间:2012-06-13 18:17:02

标签: r plot

请考虑以下事项:

set.seed(1)
RandData <- rnorm(100,sd=20)
Locations <- rep(c('England','Wales'),each=50)
today <- Sys.Date()
dseq <- (seq(today, by = "1 days", length = 100))

Date <- as.POSIXct(dseq, format = "%Y-%m-%d")

Final <- cbind(Loc = Locations, Doy = as.numeric(format(Date,format = "%j")), Temp = RandData)

在这个例子中,如何在同一个数字窗口中生成两个图,第一个图显示英格兰对Doy的温度,第二个图显示威尔士对Doy的温度?

2 个答案:

答案 0 :(得分:1)

请注意,您的数据是字符矩阵。如果Final对象是通过以下方式创建的,那就更好了。

Final <- data.frame(Loc = Locations,
                    Doy = as.numeric(format(Date,format = "%j")),
                    Temp = RandData)

这样,下面的代码在一个窗口上并排绘制两个图。我使用plot()的公式接口来使用它的subset参数,它的作用类似于subset()函数。

ylab <- "Temperature"
xlab <- "Day of year"

layout(matrix(1:2, ncol = 2))
plot(Temp ~ Doy, data = Final, subset = Loc == "England", main = "England",
     ylab = ylab, xlab = xlab)
plot(Temp ~ Doy, data = Final, subset = Loc == "Wales", main = "Wales",
     ylab = ylab, xlab = xlab)
layout(1)

产生这个情节:

england wales temperatures

如果你想要它们都是相同的比例,那么我们稍微修改一下:

ylab <- "Temperature"
xlab <- "Day of year"
xlim <- with(Final, range(Doy))
ylim <- with(Final, range(Temp))
layout(matrix(1:2, ncol = 2))
plot(Temp ~ Doy, data = Final, subset = Loc == "England", main = "England",
     ylab = ylab, xlab = xlab, xlim = xlim, ylim = ylim)
plot(Temp ~ Doy, data = Final, subset = Loc == "Wales", main = "Wales",
     ylab = ylab, xlab = xlab, xlim = xlim, ylim = ylim)
layout(1)

生成此版本的情节

england wales temp with same scaling

对于线图,您需要以Doy顺序获取数据,然后将type = "l"添加到plot()来电。

为了完整起见,@ Justin已经展示了如何使用其中一个高级绘图软件包来实现类似但通过 ggplot2 减少用户工作量。 lattice 包是R中另一个主要的高级绘图包。您可以使用lattice via实现相同的绘图:

require(lattice)
xyplot(Temp ~ Doy | Loc, data = Final, type = c("l","p")

后者产生

england wales temp v3 via lattice

仅使用type = "p"获得积分,type = "l"仅用于积分。正如您所看到的,更高级别的包使得生成这些图比使用基本图形包更容易。

答案 1 :(得分:0)

通过使用cbind创建数据,它们都被强制转换为character。而是使用data.frame()

Final <- data.frame(Loc = Locations, 
                    Doy = as.numeric(format(Date,format = "%j")), 
                    Temp = RandData)

ggplot做得非常好。

library(ggplot2)
ggplot(Final, aes(x=Doy, y=Temp)) + geom_path() + facet_wrap( ~ Loc)

或者你可以使用着色:

ggplot(Final, aes(x=Doy, y=Temp, color=Loc)) + geom_path()