ggplot2 中的反向叠加 alpha 值

Reverse overplotting alpha value in ggplot2

ggplot2 中的 alpha 值通常用于帮助在 R 中进行重叠绘图。较深的颜色表示许多观测值落入的区域,而较浅的颜色表示只有少数观测值落入的区域。有可能扭转这一局面吗?因此,异常值(通常很少观察)被强调为较暗,而大多数数据(通常有很多观察)被强调为较浅?

下面是一个 MWE:

myDat <- data.frame(x=rnorm(10000,0,1),y=rnorm(10000,0,1))
qplot(x=x, y=y, data=myDat, alpha=0.2)

远离中心 (0,0) 的观测值越稀有,颜色越浅。我该如何扭转呢?谢谢你的任何想法。

您可以尝试分别为每个点设置 alpha 值,不透明度从中心开始增加。像这样

p = 2 # adjust this parameter to set how steeply opacity ncreases with distance
d = (myDat$x^2 + myDat$y^2)^p
al = d / max(d)
ggplot(myDat, aes(x=x, y=y))  + geom_point(alpha = al)

尝试使用距质心的马哈拉诺比斯距离作为离群值(得分较高的可以分配较深的颜色,而不是使用 alpha 值):

myDat <- data.frame(x=rnorm(10000,0,1),y=rnorm(10000,0,1))
mu <- colMeans(myDat)

# assuming x, y independent, if not we can always calculate a non-zero cov(x,y)
sigma <- matrix(c(var(myDat$x), 0, 0, var(myDat$y)), nrow=2) 
# use (squared) *Mahalanobis distance* as outlier score
myDat$outlier.score <- apply(myDat, 1, function(x) t(x-mu)%*%solve(sigma)%*%(x-mu))
qplot(x=x, y=y, data=myDat, col=outlier.score) + 
     scale_color_gradient(low='white', high='blue')

# assuming x, y are not independent
sigma <- matrix(c(var(myDat$x), cov(myDat$x, myDat$y), cov(myDat$x, myDat$y), var(myDat$y)), nrow=2) 
# use (squared) *Mahalanobis distance* from centroid as outlier score
myDat$outlier.score <- apply(myDat, 1, function(x) t(x-mu)%*%solve(sigma)%*%(x-mu)) 
qplot(x=x, y=y, data=myDat, col=outlier.score) + 
    scale_color_gradient(low='white', high='blue')