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

Как получить обратную шкалу log10 в ggplot2?

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

require(ggplot2)
df <- data.frame(x=1:10, y=runif(10))
p <- ggplot(data=df, aes(x=x, y=y)) + geom_point() 

Однако кажется, что я могу либо шкалу log10, либо обратную шкалу:

p + scale_x_reverse() + scale_x_log10() 

log10 scale, but not reversed

p + scale_x_reverse()

reversed scale, but not log10

Я думаю, это логично, если на слое может быть только один масштаб. И, конечно же, я мог взломать его, выполнив лог-преобразование на ядре данных, df$xLog <- log10(df$x) но это решение кажется противоречащим духу ggplot. Есть ли способ получить такой сюжет, не делая преобразования данных, внешние по отношению к вызову ggplot?

4b9b3361

Ответ 1

Ссылка, которую @joran дал в своем комментарии, дает правильную идею (создайте собственное преобразование), но устарела в отношении нового пакета scales, который используется ggplot2. Рассматривая log_trans и reverse_trans в пакете весов для руководства и вдохновения, можно выполнить функцию reverselog_trans:

library("scales")
reverselog_trans <- function(base = exp(1)) {
    trans <- function(x) -log(x, base)
    inv <- function(x) base^(-x)
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
              log_breaks(base = base), 
              domain = c(1e-100, Inf))
}

Это можно использовать просто как:

p + scale_x_continuous(trans=reverselog_trans(10))

который дает график:

enter image description here

Используя несколько иной набор данных, чтобы показать, что ось определенно обращена:

DF <- data.frame(x=1:10,  y=1:10)
ggplot(DF, aes(x=x,y=y)) + 
  geom_point() +
  scale_x_continuous(trans=reverselog_trans(10))

enter image description here