Как я могу построить плавную линию над точками графика, например, контур / горизонт графика?

#r #plot #max

#r #график #макс

Вопрос:

То, что я ищу, лучше всего объясняется изображением: линией, которая «очерчивает» максимумы моих точек (например, дает «горизонт» графика). У меня есть график разбросанных точек с плотными (в основном) уникальными координатами x (неравномерно распределенными по любой оси). Я хочу, чтобы красная линия пересекала этот график:

график, который очерчивает максимумы графика

То, что я пробовал / думал до сих пор, заключается в том, что простой подход «рисовать как линию» терпит неудачу из-за плотного характера данных с уникальными значениями x и множеством локальных максимумов и минимумов (в основном в каждой точке). Тот же факт делает невозможным простой подход «получить максимум».

Поэтому я спрашиваю: есть ли какая-то опция сглаживания для графика? Или любой существующий оператор «горизонта» для графика?

Я специально НЕ ищу «контурный график» или «график горизонта» (как в Bayesian skylineplot) — термины на самом деле описывают то, что я хочу, но, к сожалению, уже используются для других целей.

Вот минимальная версия того, с чем я работаю до сих пор, отрицательный пример lines того, что не дает желаемых результатов. Я загрузил образцы данных здесь.

 load("xy_lidarProfiles.RData")
plot(x, y, 
          xlab="x", ylab="y", # axis
          pch = 20, # point marker style (1 - 20)
          asp = 1 # aspect of x and y ratio
)
lines(x, y, type="l", col = "red") # makes a mess
 

это не то, что я хочу, но получаю при использовании R линий

Ответ №1:

Вы приблизитесь к желаемому результату, если order() будете использовать значения x. Тогда вам нужен текущий максимум, который TTR::runMax() обеспечивает.

 plot(x[order(x)], y[order(x)], pch=20)
lines(x[order(x)], TTR::runMax(y[order(x)], n=10), col="red", lwd=2)
 

введите описание изображения здесь

Вы можете настроить окно с n= помощью параметра.

Комментарии:

1. Хорошее решение. В более общем плане, если локальный максимум не соответствует тому, что вы хотите (например, он недостаточно гладкий), zoo::rollapply функция может найти другие локальные огибающие.