如何裁剪R中的插值层以使其不超出数据边界

时间:2018-08-03 17:16:07

标签: r ggplot2 interpolation contour clip

我正在尝试使用等值线在泻湖环境中显示电导率的横截面。我已将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") 应用于我的数据,但是我想剪切插值输出,以使其不会超出我的数据点。这样,横截面上泻湖的水深就很清楚了。这是我到目前为止使用的代码:

geom_point()

以下是输出:

interpolated plot

为澄清起见,这里的数据就像cond_df%>% ggplot(mapping=aes(x=stop, y=depth, z=conductivity, fill=conductivity)) + geom_point(aes(colour = conductivity), size = 3) + scale_y_reverse() 图一样,我不希望插值层超过图的较低点:

contourf()

point plot

1 个答案:

答案 0 :(得分:1)

您可以使用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)