(这是我的第一篇文章,因此(i)我希望不要违反太多规则,并且(ii)必须在外部存储示例地块)
我想可视化不规则的网格时间序列数据,其中显示的参数也是地理度量(如纬度或水深)的函数。包含日期(日期),地理参数水深(dep)和感兴趣的盐度(sal)参数的示例数据文件以及使用ggplot2
生成的初步散点图存储在我们的
owncloud
密码:时间序列
ggplot图的R代码为:
# Load required packages
library(ggplot2)
library(data.table)
library(colorRamps)
library(scales)
# Import spatial timeseries data
df <- data.table(read.csv("timeseries_example.csv"))
df$date <- as.POSIXct(strptime(df$date, format="%m/%d/%Y", tz="GMT"))
# Scatterplot with color representing the z parameter
Fig <-
ggplot(data=df, aes(date, dep, col=Sal))+
geom_point()+
scale_y_reverse()+
scale_colour_gradientn(colours = matlab.like2(7), oob=squish)
tiff("./example_timeseries_R_ggplot.tiff", width = 200, height = 100,
units = 'mm', res = 300, compression = 'lzw')
Fig
dev.off()
由于数据在空间和时间上的间隔不规则,因此使用ggplot的
geom_tile()
函数进行绘图需要进行插值。免费提供的软件海洋数据视图(ODV)可以进行这种插值,我想重现同样存储在我们自己的Cloud中(上面的链接)的R的ODV图。
由于此问题与先前解决的问题相似,因此我尝试使用包
akima
在更细的日期和dep网格上插值参数sal。但是,这不适用于x参数是POSIXct对象的情况。有人对此有解决方案吗?
最佳答案
我在MBA套餐方面有好运:
# Load required packages
library(ggplot2)
library(lubridate)
library(reshape2)
library(colorRamps)
library(scales)
library(MBA)
# Import spatial timeseries data
df <- read.csv("timeseries_example.csv")
df$date <- as.POSIXct(strptime(df$date, format="%m/%d/%Y", tz="GMT"))
df$date <- decimal_date(df$date)
mba <- mba.surf(df[,c('date', 'dep', 'Sal')], 100, 100)
dimnames(mba$xyz.est$z) <- list(mba$xyz.est$x, mba$xyz.est$y)
df3 <- melt(mba$xyz.est$z, varnames = c('date', 'depth'), value.name = 'salinity')
Fig <-
ggplot(data=df3, aes(date, depth))+
geom_raster(aes(fill = salinity), interpolate = F, hjust = 0.5, vjust = 0.5) +
geom_contour(aes(z = salinity)) +
geom_point(data = df, aes(date, dep), colour = 'white') +
scale_y_reverse() +
scale_fill_gradientn(colours = matlab.like2(7))
Fig
使用插值设置可以解决一些异常情况。我只是使用默认值。