如何在ggplot2中获得反转的log10比例?

时间:2012-06-15 15:37:07

标签: r ggplot2

我想使用ggplot2制作一个反转的log10 x比例图:

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 个答案:

答案 0 :(得分:51)

@joran在评论中提供的链接提供了正确的想法(构建您自己的转换),但对于scales现在使用的新ggplot2包已过时。查看比例包中的log_transreverse_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

答案 1 :(得分:1)

ggforce程序包具有用于此任务的trans_reverser()功能。

reduce

reprex package(v0.3.0)于2020-11-14创建