Как получить обратный масштаб 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() 

Тем не менее, кажется, что я могуeither шкала log10or обратная шкала:

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?

 joran15 июн. 2012 г., 17:57
Я ожидал, что это сработает, но, видимо, это немного сложно. Былwork-around это, кажется, сломано в самой последней версии. Если @kohske или кто-то другой не может придумать другое решение, возможно, он запросит хорошую функцию.

Ответы на вопрос(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

 18 янв. 2015 г., 05:23
@Richard Я только что проверил, и это работает, ноscales пакет должен быть прикреплен к пути поиска (library("scales")). Это не ясно в ответе (и, возможно, не было необходимости в то время). Обновление.
 18 янв. 2015 г., 07:07
Это так просто? Большое спасибо!!
 10 мар. 2017 г., 18:45
В качестве альтернативы используйте нотацию :: для явного вызова функций из пакета scale. ---reverselog_trans <- function(base = exp(1)) { trans <- function(x) -log(x, base) inv <- function(x) base^(-x) scales::trans_new(paste0("reverselog-", format(base)), trans, inv, scales::log_breaks(base = base), domain = c(1e-100, Inf)) }
 17 янв. 2015 г., 09:42
Я боюсь, что это решение больше не работает: Ошибка в reverselog_trans (10): не удалось найти функцию & quot; trans_new & quot; Явное добавление scale :: trans_new только приводит к появлению новых ошибок, кажется, что функция scale была обновлена :(
 09 янв. 2019 г., 16:45
NB:reverselog_trans функция появилась в CRANcran.r-project.org/web/packages/ACSNMineR/index.html (найдено в ACSNMineR / R / plots.R).

Ваш ответ на вопрос