Подтвердить что ты не робот

Преобразование цветовой гаммы, но сохранить красивую легенду с ggplot2

Я видел несколько подобных вопросов, но я хотел бы задать свой конкретный вопрос так, как только могу:

У меня есть график рассеяния с переменной "z", закодированной в цветовой шкале:

library(ggplot2)
myData <- data.frame(x = rnorm(1000),
                     y = rnorm(1000))
myData$z <- with(myData, x * y)

badVersion <- ggplot(myData,
              aes(x = x, y = y, colour = z))
badVersion <- badVersion + geom_point()
print(badVersion)

Что производит это: bad version

Как вы можете видеть, так как переменная "z" обычно распределяется, очень немногие из точек окрашены "экстремальными" цветами дистрибутива. Это так, как должно быть, но я заинтересован в том, чтобы подчеркнуть разницу. Один из способов сделать это - использовать:

betterVersion <- ggplot(myData,
                        aes(x = x, y = y, colour = rank(z)))
betterVersion <- betterVersion + geom_point()
print(betterVersion)

Что производит это: better version

Применяя rank() к переменной "z", я получаю гораздо больший акцент на незначительных различиях в переменной "z". Можно предположить, что здесь можно использовать любое преобразование вместо ранга, но вы получаете идею.

Мой вопрос заключается, по сути, в том, что является самым простым способом или самым "истинным ggplot2" способом получения легенды в исходных единицах (единицы z, в отличие от ранга z), при сохранении преобразованная версия цветных точек?

У меня такое чувство, что использование rescaler() каким-то образом, но мне не ясно, как использовать rescaler() с произвольными преобразованиями и т.д. В целом, более понятные примеры были бы полезны.

Заранее благодарим за ваше время.

4b9b3361

Ответ 1

Посмотрите на пакет scales особенно ?trans

Я думаю, что преобразование, которое отображает цвет, учитывая вероятность получения значения или более экстремального, должно быть разумным (в основном pnorm(z))

Я думаю, что scale_colour_continuous(trans = probability_trans(distribution = 'norm') должен работать, но он выдает предупреждения.

Итак, я определил новое преобразование (см. ?trans_new)

Я должен определить преобразование и обратное

library(scales)
norm_trans <- function(){
  trans_new('norm', function(x) pnorm(x), function(x) qnorm(x))
}

badVersion + geom_point() + scale_colour_continuous(trans = 'norm'))

enter image description here

Используя поставляемый probability_trans, выдается предупреждение и, похоже, не работает

# this throws a warning
badVersion + geom_point+
  scale_colour_continuous(trans = probability_trans(distribution = 'norm'))

## Warning message:
## In qfun(x, ...) : NaNs produced

enter image description here