2016-12-31 2 views
2

Значение альфа в ggplot2 часто используется, чтобы помочь с перепланированием в R. Темные цвета представляют области, где выпадают многие наблюдения, а более светлые цвета представляют области, в которых падает только несколько наблюдений. Можно ли это отменить? Итак, эти выбросы (обычно с небольшим количеством наблюдений) подчеркиваются как более темные, тогда как большинство данных (с обычно большим количеством наблюдений) подчеркиваются как более легкие?Обратное перекрытие альфа-значения в ggplot2

Ниже 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) легче. Как я могу отменить это? Спасибо за любые идеи.

+1

В зависимости от вас точных требований, вы можете рассмотреть [geom_density_2d] (http://docs.ggplot2.org/current/geom_density_2d.html). См. второй последний пример вместе с [scale_fill_gradient] (http://docs.ggplot2.org/current/scale_gradient.html), где вы можете установить цвета «низкий» и «высокий» по вашему выбору. – Henrik

ответ

5

Вы можете попробовать установить значение альфа для каждой точки отдельно, с непрозрачностью, увеличивающейся дальше от центра. Что-то вроде этого

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) 

enter image description here

3

Попробуйте это Махаланобис расстояния от центроида, как останец оценка (те, с более высокими баллами может быть назначены более темными цвета, вместо того, чтобы использовать альфа-значение):

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

enter image description here

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

enter image description here

Смежные вопросы