48

我想使用 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 比例,但不反转

p + scale_x_reverse()

反转比例,但不是 log10

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

4

3 回答 3

63

@joran 在他的评论中给出的链接给出了正确的想法(构建你自己的转换),但是对于现在使用的新scales包来说已经过时了ggplot2。查看log_transreverse_trans在 scales 包中获取指导​​和灵感,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))

这给出了情节:

在此处输入图像描述

使用稍微不同的数据集来显示轴肯定是反转的:

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))

在此处输入图像描述

于 2012-06-15T16:32:47.130 回答
10

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()

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

于 2020-11-15T00:26:25.863 回答
2

您可以在规范中直接在 ggplot 函数中应用对数aes()

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

然后反转x轴

p + scale_x_reverse()

这样你的数据不会改变,但你可以缩放图表

于 2021-10-30T22:26:16.870 回答