#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
Ответ №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
функция может найти другие локальные огибающие.