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

Есть ли встроенный способ сделать логарифмическую цветовую шкалу в ggplot2?

Здесь приведен пример плотной диаграммы плотности:

require(ggplot2)
n <- 1e5
df <- data.frame(x = rexp(n), y = rexp(n))
p <- ggplot(df, aes(x = x, y = y)) + stat_binhex()
print(p)

enter image description here

Было бы неплохо настроить цветовую шкалу так, чтобы разрывы были разделены интервалами, но попробуйте

my_breaks <- round_any(exp(seq(log(10), log(5000), length = 5)), 10)
p + scale_fill_hue(breaks = as.factor(my_breaks), labels = as.character(my_breaks))

Результаты в Error: Continuous variable () supplied to discrete scale_hue. Кажется, разрывы ожидают фактор (возможно?) и разработаны с учетом категориальных переменных?

Там не встроенный обход, который я выложу в качестве ответа, но я думаю, что я мог бы просто потеряться в использовании scale_fill_hue, и я хотел бы знать, есть ли что-то очевидное. отсутствует.

4b9b3361

Ответ 1

Да! Для scale_fill_gradient есть аргумент trans, который я пропустил раньше. Благодаря этому мы можем получить решение с соответствующей легендой и цветовой гаммой, а также красивый сжатый синтаксис. Используя p из вопроса и my_breaks = c(2, 10, 50, 250, 1250, 6000):

p + scale_fill_gradient(name = "count", trans = "log",
                        breaks = my_breaks, labels = my_breaks)

enter image description here

Мой другой ответ лучше всего использовать для более сложных функций данных. Комментарий Хэдли побудил меня найти этот ответ в примерах внизу ?scale_gradient.

Ответ 2

Другой способ: использовать пользовательскую функцию в stat_summary_hex:

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) + 
  stat_summary_hex(function(z){log(sum(z))})

Теперь это часть ggplot, но изначально она была вдохновлена ​​замечательным кодом от @kohske в этом ответе, который предоставил пользовательский stat_aggrhex. В версиях ggplot > 2.0 используйте приведенный выше код (или другой ответ)

ggplot(cbind(df, z = 1), aes(x = x, y = y, z = z)) +
    stat_aggrhex(fun = function(z) log(sum(z))) +
    labs(fill = "Log counts")

Чтобы сгенерировать этот график.

enter image description here