Ограничить контурный участок выпуклой оболочкой другого участка - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть контурный график в R. Я хотел бы показать только область этого графика, которая лежит внутри выпуклой оболочки набора точек данных из другого графика.Все области за пределами этой области должны быть пустыми (белыми).

Воспроизводимый пример:

Вот график, который создает выпуклую оболочку:

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

enter image description here

Вот другой график, показывающий некоторые контуры (здесь используется пакет '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")

enter image description here

Теперь я хочу показать только ту часть контурного графика, которая находится в пределах значений, заданных выпуклой оболочкой из первого графика, и задать для всего остального контурного графика белый цвет.Буду очень признателен, если у кого-нибудь будет совет, как это сделать.

1 Ответ

0 голосов
/ 14 февраля 2019

Возможное решение на основе shapes внутри layout.Подробнее см. здесь .
SVG path для выпуклой оболочки и площади участка должны быть определены.Синтаксис определен здесь .

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")
))

enter image description here

...