如何在 R 中裁剪插值层,使其不超出数据边界
How to clip an interpolated layer in R so it does not extend past data boundaries
我正在尝试使用等值线显示泻湖环境中的电导率横截面。我已将 interp()
和 stat_contour()
应用于我的数据,但我想剪辑插值输出,使其不会超出我的数据点。这样断面泻湖的测深就一目了然了。这是我到目前为止使用的代码:
cond_df <- read_csv("salinity_profile.csv")
di <- interp(cond_df$stop, cond_df$depth, cond_df$conductivity,
xo = seq(min(cond_df$stop), max(cond_df$stop), length = 200),
yo = seq(min(cond_df$depth), max(cond_df$depth), length = 200))
dat_interp <- data.frame(expand.grid(x=di$x, y=di$y), z=c(di$z))
ggplot(dat_interp) +
aes(x=x, y=y, z=z, fill=z)+
scale_y_reverse() +
geom_tile()+
stat_contour(colour="white", size=0.25) +
scale_fill_viridis_c() +
theme_tufte(base_family="Helvetica")
这是输出:
interpolated plot
为了帮助澄清,这里是数据 geom_point()
图表,我不希望插值层超过图表的较低点:
cond_df%>%
ggplot(mapping=aes(x=stop, y=depth, z=conductivity, fill=conductivity)) +
geom_point(aes(colour = conductivity), size = 3) +
scale_y_reverse()
point plot
您可以使用 geom_ribbon
遮盖图中不需要的区域。
您将需要生成一个 data.frame
,其中包含每个停靠点的最大深度值。这是一种有点不雅的方法:
# Create the empty data frame for all stops
bathymetry <- data.frame(depth = as.numeric(NA),
stop = unique(cond_df$stop))
# Find the max depth for each stop
for(thisStop in bathymetry$stop){
bathymetry[bathymetry$stop==thisStop, "depth"] <- max(cond_df[cond_df$stop==thisStop, "depth"])
}
然后,您可以添加 geom_ribbon
作为情节的最后 geom
,就像这样
geom_ribbon(data=bathymetry, aes(x=stop, ymin=depth, ymax=max(cond_df$depth)), inherit.aes = FALSE)
我正在尝试使用等值线显示泻湖环境中的电导率横截面。我已将 interp()
和 stat_contour()
应用于我的数据,但我想剪辑插值输出,使其不会超出我的数据点。这样断面泻湖的测深就一目了然了。这是我到目前为止使用的代码:
cond_df <- read_csv("salinity_profile.csv")
di <- interp(cond_df$stop, cond_df$depth, cond_df$conductivity,
xo = seq(min(cond_df$stop), max(cond_df$stop), length = 200),
yo = seq(min(cond_df$depth), max(cond_df$depth), length = 200))
dat_interp <- data.frame(expand.grid(x=di$x, y=di$y), z=c(di$z))
ggplot(dat_interp) +
aes(x=x, y=y, z=z, fill=z)+
scale_y_reverse() +
geom_tile()+
stat_contour(colour="white", size=0.25) +
scale_fill_viridis_c() +
theme_tufte(base_family="Helvetica")
这是输出:
interpolated plot
为了帮助澄清,这里是数据 geom_point()
图表,我不希望插值层超过图表的较低点:
cond_df%>%
ggplot(mapping=aes(x=stop, y=depth, z=conductivity, fill=conductivity)) +
geom_point(aes(colour = conductivity), size = 3) +
scale_y_reverse()
point plot
您可以使用 geom_ribbon
遮盖图中不需要的区域。
您将需要生成一个 data.frame
,其中包含每个停靠点的最大深度值。这是一种有点不雅的方法:
# Create the empty data frame for all stops
bathymetry <- data.frame(depth = as.numeric(NA),
stop = unique(cond_df$stop))
# Find the max depth for each stop
for(thisStop in bathymetry$stop){
bathymetry[bathymetry$stop==thisStop, "depth"] <- max(cond_df[cond_df$stop==thisStop, "depth"])
}
然后,您可以添加 geom_ribbon
作为情节的最后 geom
,就像这样
geom_ribbon(data=bathymetry, aes(x=stop, ymin=depth, ymax=max(cond_df$depth)), inherit.aes = FALSE)