user3396385
user3396385

Reputation: 186

Alpha not applied for all points in ggplot scatterplot

I have been trying to produce a scatter plot with two levels of alpha applied to dots that are above or below a score threshold. To do so, I am storing the alpha value for each point in a vector, item_alpha, within the data frame and supplying this vector as the argument for alpha in my call to geom_point:

library( ggplot2 );
library( scales );
one.data <- read.table("test.data", header = TRUE)

p1 <- ggplot( data = one.data )
p1 <- p1 + geom_point( aes( plot_X, plot_Y, colour = log10_p_value, size = plot_size, alpha = item_alpha ) )
p1 <- p1 + scale_colour_gradientn( colours = c("red", "yellow", "green", "blue"), limits = c( min(one.data$log10_p_value), max(one.data$log10_p_value)));
p1 <- p1 + geom_point( aes(plot_X, plot_Y, size = plot_size), shape = 21, fill = "transparent", colour = I (alpha ("black", 0.6) ));
p1 <- p1 + scale_size( range=c(5, 30)) + theme_bw();
one.x_range = max(one.data$plot_X) - min(one.data$plot_X);
one.y_range = max(one.data$plot_Y) - min(one.data$plot_Y);
p1 <- p1 + xlim(min(one.data$plot_X) one.x_range/10,max(one.data$plot_X)+one.x_range/10);
p1 <- p1 + ylim(min(one.data$plot_Y)one.y_range/10,max(one.data$plot_Y)+one.y_range/10);
p1

However, it seems alpha is only being set properly for the eight points with the smaller value, while the remaining points remain opaque. I've consulted the ggplot documentation, played with the examples and tried some other variations which have mostly produced various errors and I'm really hoping someone will have some insight on this! Thanks in advance!

Contents of test.data:

"plot_X"    "plot_Y"    "plot_size" "log10_p_value" "item_alpha"
5.326   3.194   4.411   -27.3093    0.6
-2.148  7.469   3.434   -12.3487    0.6
-6.14   -2.796  3.062   -22.8069    0.6
3.648   6.091   3.597   -15.5032    0.6
0.356   -6.925  3.95    -10.4754    0.6
5.532   -0.135  3.246   -19.2883    0.6
3.794   -2.279  3.557   -16.4438    0.6
-3.784  1.42    2.914   -17.9687    0.6
-7.645  -1.571  3.163   -12.4498    0.6
-1.526  -4.756  3.509   -10.8972    0.6
-6.461  2.293   2.962   -13.4306    0.6
-5.806  0.983   4.38    -24.5422    0.6
-3.592  0.769   2.971   -17.8119    0.6
0.127   3.572   3.603   -11.4277    0.6
-0.566  0.706   3.77    -13.0952    0.3
2.25    -2.604  0.845   -11.7949    0.3
-7.845  -0.927  3.21    -12.6408    0.3
1.084   -6.691  3.654   -10.7319    0.3
-3.546  6.46    2.994   -11.6777    0.3
-5.478  -0.645  4.256   -17.7344    0.3
-6.251  -0.418  4.273   -19.29  0.3
-3.855  5.969   3.236   -10.9057    0.3
0.345   0.971   3.383   -11.5973    0.6
0.989   0.345   2.959   -10.8252    0.6

Upvotes: 3

Views: 599

Answers (1)

joran
joran

Reputation: 173517

You're using a distinctly base plotting approach with ggplot2, which is obviously not the right way to go. Here are two options:

dat <- read.table(text = "plot_X    plot_Y    plot_size log10_p_value item_alpha
5.326   3.194   4.411   -27.3093    0.6
-2.148  7.469   3.434   -12.3487    0.6
-6.14   -2.796  3.062   -22.8069    0.6
3.648   6.091   3.597   -15.5032    0.6
0.356   -6.925  3.95    -10.4754    0.6
5.532   -0.135  3.246   -19.2883    0.6
3.794   -2.279  3.557   -16.4438    0.6
-3.784  1.42    2.914   -17.9687    0.6
-7.645  -1.571  3.163   -12.4498    0.6
-1.526  -4.756  3.509   -10.8972    0.6
-6.461  2.293   2.962   -13.4306    0.6
-5.806  0.983   4.38    -24.5422    0.6
-3.592  0.769   2.971   -17.8119    0.6
0.127   3.572   3.603   -11.4277    0.6
-0.566  0.706   3.77    -13.0952    0.3
2.25    -2.604  0.845   -11.7949    0.3
-7.845  -0.927  3.21    -12.6408    0.3
1.084   -6.691  3.654   -10.7319    0.3
-3.546  6.46    2.994   -11.6777    0.3
-5.478  -0.645  4.256   -17.7344    0.3
-6.251  -0.418  4.273   -19.29  0.3
-3.855  5.969   3.236   -10.9057    0.3
0.345   0.971   3.383   -11.5973    0.6
0.989   0.345   2.959   -10.8252    0.6",header = TRUE)

dat$alpha_grp <- ifelse(dat$item_alpha == 0.6,'High','Low')

#If you want a legend; although you can suppress the legend
# here if you want.
ggplot(data = dat,aes(x = plot_X,y = plot_Y)) + 
    geom_point(aes(alpha = alpha_grp)) + 
    scale_alpha_manual(values = c(0.3,0.6))

#If you don't care about a legend
ggplot() + 
    geom_point(data = dat[dat$alpha_grp == 'High',],
                         aes(x = plot_X,y = plot_Y),alpha = 0.6) + 
    geom_point(data = dat[dat$alpha_grp == 'Low',],
                         aes(x = plot_X,y = plot_Y),alpha = 0.3)

Upvotes: 2

Related Questions