2012-06-15 2 views
26

Я хотел бы сделать сюжет с обращенным, log10 х масштабом с использованием ggplot2:Как получить обратную шкалу log10 в 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?

+2

Я ожидал, что это работает, как хорошо, но, видимо, его немного сложнее. Был [work-around] (https://groups.google.com/forum/?fromgroups#!searchin/ggplot2/reverse$20log$20scale/ggplot2/AfMf9L9y9fc/Qu-FnJLJaagJ), который, по-видимому, разбит на самая последняя версия. Если @kohske или кто-то не может придумать другое решение, может сделать хороший запрос функции. – joran

ответ

43

Ссылка, которую @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

+0

Боюсь, что это решение больше не работает: Ошибка в файле reverseelog_trans (10): не удалось найти функцию «trans_new» Явное добавление весов :: trans_new приводит к появлению новых ошибок, функция масштабирования, похоже, была обновлена ​​:( – Richard

+2

@Richard Я просто проверил его, и он работает, но пакет «весы» должен быть привязан к пути поиска ('library (« scale »)'). Это неясно в ответе (и, возможно, не было необходимости в время). Обновление –

+0

Это легко, да, спасибо! – Richard

Смежные вопросы