ggplot aes: альфа "сглаживается" - PullRequest
1 голос
/ 23 октября 2019

Я использую ggplot в пакете ggplot2 R с набором данных 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 может принимать только два значения: 1, когда класс равен suv или pickup, и 0 в противном случае. Но я получаю странный «плавный» диапазон размеров на получающемся графике:

enter image description here

(меня удивляет не легенда, а тот факт, чтона самом деле есть значения, построенные с альфа 0,1 или 0,3 или что-то еще.)

Что происходит?

1 Ответ

2 голосов
/ 23 октября 2019

(меня удивляет не легенда, а тот факт, что на самом деле есть значения, нанесенные на графике с альфа 0,1 или 0,3 или чем-то еще.)

Нет. Вы видите, что несколько точек имеют одинаковые дискретные координаты, и поэтому полупрозрачные точки перекрываются.

И чтобы исправить легенду, используйте коэффициенты или строки символов (= дискретные) вместо чисел (= непрерывно).


Не связано, но ваша реализация classify является довольно неортодоксальным кодом. Прежде всего, поскольку R является функциональным языком, все выражения являются значениями . Это означает, что вместо выполнения присваивания внутри 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...