将等高线图限制为不同图的凸包

Restrict contour plot to convex hull of a different plot

我在 R 中有一个等高线图。我只想显示该图位于来自不同图的一组数据点的凸包内的区域。此区域之外的所有区域都应为空白(白色)。

一个可重现的例子:

这是生成凸包的图:

ExampleValues <- matrix(sample(1:30), ncol = 2)
plot(ExampleValues)
hpts <- chull(ExampleValues)
hpts <- c(hpts, hpts[1])
lines(ExampleValues[hpts, ])

这是显示一些等高线的不同图(此处使用包“plotly”):

ContourPlotData <- data.frame(X = sample(1:50), Y = sample(1:50), Z = sample(1:100))
plot_ly(x = ContourPlotData$X, y = ContourPlotData$Y, z = ContourPlotData$Z, type = "contour")

现在,我只想显示第一个图中凸包指定值内的等高线图部分,并将等高线图的所有其余部分设置为白色。如果有人对如何执行此操作有任何建议,我将不胜感激。

基于 shapes 内部 layout 的可能解决方案。有关详细信息,请参阅 here
必须为凸包和绘图区域定义 SVG path。语法定义为 here.

set.seed(1)
df1 <- matrix(sample(15:46), ncol = 2)
hpts <- chull(df1)
hpts <- c(hpts, hpts[1])
df2 <- volcano

####
# Build the SVG path used in 'shapes'
####
nc <- ncol(df2)
nr <- nrow(df2)

# Plot area
xbox <- c(1, 1, nc, nc, 1)-1
ybox <- c(1, nr, nr, 1, 1)-1

# Convex hull
xpoly <- c(df1[hpts, 1])
ypoly <- c(df1[hpts, 2])

# SVG path (see https://www.w3schools.com/graphics/svg_path.asp )
pathbox <- c(paste0(xbox,",",ybox))
pathbox <- paste0(c("M",rep("L",length(pathbox)-1)), pathbox)

pathpoly <- c(paste0(xpoly,",",ypoly))
pathpoly <- paste0(c("M",rep("L",length(pathpoly)-1)), pathpoly)

SVGpath <- paste(c(pathpoly, pathbox,"Z"),collapse=" ")

library(plotly)
plot_ly(z=~df2, type = "contour") %>%
layout(shapes = list(
       list(type='path', path=SVGpath, fillcolor="white")
))