我正在尝试获得类似于 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来完成这个?这真的有两个部分。第一个是找出坐标变换后的异常值是什么,第二个是只绘制这些点。
最佳答案
这是一种解决方法! Is 不适用于最不密集的 n 个点,但绘制密度 ^0.25 小于 x 的所有点。
它实际上绘制了 stat_density2d()
层,然后是 geom_point(
,然后是 stat_density2d()
,使用 alpha 在最后一层的中间创建一个透明的“洞”,其中密度 ^0.25 高于(在这种情况下为 0.25)。
显然,您对运行三个图有性能影响。
# 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))
关于r - 如何在ggplot中重现smoothScatter的异常值绘图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13094827/