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

Dre*_*een 38 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() 
Run Code Online (Sandbox Code Playgroud)

但是,似乎我可以使用 log10比例反转比例:

p + scale_x_reverse() + scale_x_log10() 
Run Code Online (Sandbox Code Playgroud)

log10规模,但没有逆转

p + scale_x_reverse()
Run Code Online (Sandbox Code Playgroud)

反转比例,但不是log10

我想这是合乎逻辑的,如果一个图层只能有一个比例.当然,我可以通过自己对数据df$xLog <- log10(df$x) 框进行日志转换来破解它,但是这个解决方案似乎与ggplot的精神背道而驰.有没有办法在不进行ggplot调用外部的数据转换的情况下获得这种情节?

Bri*_*ggs 55

@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))
}
Run Code Online (Sandbox Code Playgroud)

这可以简单地用作:

p + scale_x_continuous(trans=reverselog_trans(10))
Run Code Online (Sandbox Code Playgroud)

给出了情节:

在此输入图像描述

使用稍微不同的数据集来显示轴明确颠倒:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • @Richard我刚检查它并且它可以工作,但`scales`包必须附加到搜索路径(`library("scales")`).这在答案中并不清楚(当时可能没有必要).更新. (2认同)

Tun*_*ung 7

ggforce包具有trans_reverser()此任务的功能。

library(ggplot2)
library(ggforce)

p <- ggplot() +
  geom_line(aes(x = 1:100, y = 1:100))

p +
  scale_x_continuous(trans = trans_reverser('log10')) +
  annotation_logticks(sides = 'tb') +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.3.0)于 2020 年 11 月 14 日创建


小智 6

只是想我对这个问题给出了更新的答案,不需要编写您自己的转换。从scales版本1.2.0(2022年4月发布)开始,变换组合由scales包直接处理。scale_x_continuous()将, 与trans参数一起用作向量,并同时使用log10reverse。你需要放在log10前面reverse,否则你会得到一个错误;转换按指定的顺序应用。

p + scale_x_continuous(trans = c("log10", "reverse"))
Run Code Online (Sandbox Code Playgroud)

Even的文档scales::compose_trans以这种用法为例。