Как воспроизвести плавное выделение строк в ggplot?

Я пытаюсь получить что-то вроде функции smoothScatter, только в ggplot. Я выяснил все, кроме графика N самых разреженных точек. Может ли кто-нибудь помочь мне с этим?

library(grDevices)
library(ggplot2)

# Make two new devices
dev.new()
dev1 <- dev.cur()
dev.new()
dev2 <- dev.cur()

# Make some data that needs to be plotted on log scales
mydata <- data.frame(x=exp(rnorm(10000)), y=exp(rnorm(10000)))

# Plot the smoothScatter version
dev.set(dev1)
with(mydata, smoothScatter(log10(y)~log10(x)))

# Plot the ggplot version
dev.set(dev2)
ggplot(mydata) + aes(x=x, y=y) + scale_x_log10() + scale_y_log10() + 
  stat_density2d(geom="tile", aes(fill=..density..^0.25), contour=FALSE) +
  scale_fill_gradientn(colours = colorRampPalette(c("white", blues9))(256))

Обратите внимание, что в базовой графической версии 100 самых "разреженных" точек построены по графику сглаженной плотности. Разреженность определяется значением оценки плотности ядра в координате точки, и, что важно, оценка плотности ядра вычисляется после преобразования логарифма (или любого другого преобразования координат). Я могу построить все точки, добавив + geom_point(size=0.5), но мне нужны только редкие.

Есть ли способ выполнить это с помощью ggplot? На самом деле есть две части. Первый заключается в том, чтобы выяснить, что происходит после преобразований координат, а второе - отображать только те точки.

Ответ 1

Вот один из способов решения! Не работает на наименьших плотных n точках, но отображает все точки с плотностью ^ 0,25 меньше, чем x.

На самом деле он отображает слой stat_density2d(), затем geom_point(, затем stat_density2d(), используя альфу, чтобы создать прозрачную "дыру" в середине последнего слоя, где плотность ^ 0,25 выше (в этом случай) 0,4.

Очевидно, что у вас есть производительность при запуске трех графиков.

# Plot the ggplot version
ggplot(mydata) + aes(x=x, y=y) + scale_x_log10() + scale_y_log10() + 
  stat_density2d(geom="tile", aes(fill=..density..^0.25, alpha=1), contour=FALSE) + 
  geom_point(size=0.5) +
  stat_density2d(geom="tile", aes(fill=..density..^0.25,     alpha=ifelse(..density..^0.25<0.4,0,1)), contour=FALSE) + 
  scale_fill_gradientn(colours = colorRampPalette(c("white", blues9))(256))

enter image description here