Я хочу нарисовать линию плотности на диаграмме рассеяния, используя ggplot2.
Ссылаясь на этот код, я рисую пример рисунка ниже:
set.seed(1)
df <- data.frame(x = rnorm(200), y = rnorm(200))
ggplot(df, aes(x = x, y = y)) +
geom_point() +
geom_density_2d()
Ожидаемый результат здесь.
@MrFlick Спасибо за ваш комментарий! Исходные данные имеют ограниченный диапазон от 0 до 1,5. Я просто хочу визуализировать плотность данных по границе данных.
Отсутствие бесконечности, stat_chull и накатывание собственного ggplot statChull.
@Chris Спасибо за ваш комментарий. Хотя stat_chull
вернул угловой контур точек, он работает хорошо.
Вы можете использовать собственный «разрыв», чтобы добавить контуры плотности за пределами диапазона данных. Я произвольно выбрал значение контура 0,005, исходя из обратного числа точек — я выделил его красным для контраста.
ggplot(df, aes(x = x, y = y)) +
geom_point() +
geom_density_2d() +
geom_density_2d(breaks=c(0.005), col = "red")
Я не знаю, есть ли способ определить подходящее значение breaks
, которое гарантированно даст единую связную область, включающую все точки, не говоря уже о том, чтобы сделать ее очень маленькой.
Мы могли бы использовать ggalt::geom_encircle()
:
library(ggplot2)
library(ggalt)
set.seed(1)
df <- data.frame(x = rnorm(200), y = rnorm(200))
ggplot(df, aes(x = x, y = y)) +
geom_point() +
geom_density_2d() +
geom_encircle(color = "red")
Created on 2024-07-12 with reprex v2.0.2
Что именно вы хотите, чтобы представляла эта внешняя линия? За пределами этой линии нет точек, определяющих границу. Имеют ли ваши данные фиксированный диапазон? В противном случае вполне возможно, что баллы уйдут в бесконечность. Возможно, вы ищете какую-то выпуклую оболочку? При оценке плотности вы часто предполагаете, что переменные могут стремиться к бесконечности.