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')
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')