Как воспроизвести плавное выделение строк в 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]()