![](/img/trans.png)
[英]R: How to plot multiple boxplots, each from a single column in a dataset, on the same ggplot?
[英]How to plot multiple semi-variogram from a single dataset efficiently in R?
我有一个名为seoul1to7的数据框,其中包含2012年3月1日至7月7日的每小时PM10浓度数据。 请下载。 在此数据集中,时间采用yyyymmddhr格式,例如2012030101表示2012年3月1日凌晨1:00
数据如下所示:
ID time PM10 LAT LON
1 111121 2012030101 42 37.56464 126.976
2 111121 2012030102 36 37.56464 126.976
3 111121 2012030103 46 37.56464 126.976
4 111121 2012030104 40 37.56464 126.976
.
.
我的最终目标是每小时绘制半方差图。 例如,对于2012年3月1日凌晨1.00(2012030101),有107个PM10数据。 我想绘制2012030101至2012030723的半变异函数(共7 * 24个半变异函数)。 我在R中写了一些代码:
seoul1to7<-read.csv("seoul1to7.csv", row.names=1)
rownames(seoul1to7)<-NULL
seoul311<-subset(seoul1to7, time==2012030101)
seoul312<-subset(seoul1to7, time==2012030102)
.
.
.
seoul3723<-subset(seoul1to7,time==2012030724)
首先,我尝试通过subset()
函数制作所需的(7 * 24)个数据帧,然后想为每个数据帧绘制半变异函数,例如,我通过以下代码绘制了seoul311
(对于2012030101)的半变异函数:
library(sp)
library(gstat)
library(rgdal)
seoul311<-read.csv("seoul311.csv",row.name=1)
seoul311<-na.omit(seoul311)
coordinates(seoul311)=~LON+LAT
proj4string(seoul311) = "+proj=longlat +datum=WGS84"
seoul311<-spTransform(seoul311, CRS("+proj=utm +north +zone=52 +datum=WGS84"))
#plot Omnidirectional Variogram
seoul311.var<-variogram(PM10~1,data=seoul311,cutoff=66000, width=6000)
seoul311.var
plot(seoul311.var, col="black", pch=16,cex=1.3,
xlab="Distance",ylab="Semivariance",
main="Omnidirectional Variogram for seoul 311")
#Model fit
model.311<- fit.variogram(seoul311.var,vgm(psill=250,model="Gau",range=40000,nugget=100),
fit.method = 2)
plot(seoul311.var,model=model.311, col="black", pch=16,cex=1.3,
xlab="Distance",ylab="Semivariance",
main="Omnidirectional Variogram for seoul 3112")
#Directional Variogram
seoul311.var1<-variogram(PM10~1,data=seoul311,width=6000,cutoff=66000,
alpha=seq(0,135,45),tol.hor=15)
seoul311.var1
plot(seoul311.var1,model=model.311, cex=1.1,pch=16,col=1,
main="ANisotropic Variogram for PM10")
#anisotropy corrected variograms
model.3112.anis<- fit.variogram(seoul311.var1,vgm(250,"Gau",40000,100,anis=c(45,0.80)),
fit.method = 2)
#Final isotropic variogram for kriging
plot(seoul311.var,model=model.3112.anis, col="black", pch=16,cex=1.3,
xlab="Distance",ylab="Semivariance",
main="Final Isotropic Variogram")
但是我知道我的代码效率很低! 我正在编写(7 * 24) subset(seoul1to7, time==2012030101)
此代码。 然后再次(7 * 24)倍绘制半变异函数的代码! 我认为这是非常不合适的方式。
因此,如何从我的数据集seoul1to7
(通过使用循环或任何其他函数)非常有效地绘制这些(7 * 24)半变异函数图? 如果您需要任何其他信息,请告诉我。
library(sp)
library(gstat)
library(rgdal)
library(automap)
seoul1to7<-read.csv("seoul1to7.csv", row.names=1)
seoul1to7 <- na.omit(seoul1to7)
seoul1to7_split<-split(seoul1to7,seoul1to7$time) #a list contain 161 dataframe
seq(seoul1to7_split)
### now we loop (using lapply()) over each seoul1to7_split entry and calculate
### variogram using autofitVariogram and return the variogram plot
vars<-lapply(seq(seoul1to7_split), function(i)
{
dat<-seoul1to7_split[[i]] # for list element [[]]
coordinates(dat)<-~LON+LAT
proj4string(dat) <- "+proj=longlat +datum=WGS84"
dat <- spTransform(dat, CRS("+proj=utm +north +zone=52 +datum=WGS84"))
variogram<-autofitVariogram(log(PM10)~1,dat)
plot<- plot(variogram,plotit=FALSE, asp=1)
### in case you do not want to fix xlim and ylim to be identical
### for each plot just comment out the following line or change
### values as you see fit
#plt <- update(plt, xlim = c(-1000, 35000), ylim = c(0, 1000))
return(plot)
})
### now we actually have 23 * 7 variogram plots which we will combine
### into 23 hourly plots using latticeCombineGrid()
library(raster)
library(devtools)
#install.packages("Rcpp")
install_github("environmentalinformatics-marburg/Rsenal")
library(Rsenal)
names(seoul1to7_split)
hours<-substr(names(seoul1to7_split),9,10) #substructuring 9th to 10th digit of every element
hours
unique(hours)
class(unique(hours)) #character
seq(unique(hours))
var7_per_plot<-lapply(seq(unique(hours)), function(j)
{
index<- hours %in% unique(hours)[j]
plot.hours <- vars[index]
return(latticeCombineGrid(plot.hours, layout =c(3,3)))
})
var7_per_plot[[1]]
var7_per_plot[[2]]
.
.
.
var7_per_plot[[23]]
特别感谢Tim Appelhans教给我的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.