ggplot aes:alpha变得“平滑”

时间:2019-10-23 13:43:29

标签: r ggplot2 alpha alpha-transparency

我正在使用ggplot R包中的ggplot2,数据集为mpg

classify = function(cls){
    if (cls == "suv" || cls == "pickup"){result = 1}
    else {result = 0}
    return(result)
}
mpg = mpg %>% mutate(size = sapply(class, classify))

ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy, alpha = size))

现在,size只能采用两个值:当class为suvpickup时为1,否则为0。但是在结果图中,我得到了一个奇怪的“平滑”大小范围:

enter image description here

(不是让我感到惊讶的传说,而是实际上以alpha 0.1或0.3或其他值绘制的值的事实。)

这是怎么回事?

1 个答案:

答案 0 :(得分:2)

  

(不是让我感到惊讶的传说,而是实际上以alpha 0.1或0.3或其他值绘制的值的事实。)

没有。您会看到多个点具有完全相同的离散坐标,因此半透明点重叠。

要修正图例,请使用因子或字符串(=离散)而不是数字(=连续)。


无关,但是您的classify实现是非常非传统的代码。首先,由于R是一种功能语言,所以所有表达式都是 values 。这意味着,通常不用分配if的结果,而是分配if的结果:

result = if (cls == "suv" || cls == "pickup") 1 else 0

更重要的是,不需要result变量,也不需要return函数调用(R中的函数执行提早退出)。相反,惯用的R实现将如下所示:

classify = function(cls) {
    if (cls == "suv" || cls == "pickup") 1 else 0
}

更好的是,使用向量化的ifelse而不是非向量化的if

classify = function(cls) {
    ifelse(cls == "suv" | cls == "pickup", 1, 0)
}

现在您可以使用classify而不使用sapply

mpg = mpg %>% mutate(size = classify(class))