我在这里生成了一个带有正数和负数的精细直方图。

x <- rnorm(5000,0,1000)
library(ggplot2)
df <- data.frame(x)
ggplot(df, aes(x = x)) + geom_histogram()

我想要的是有一个记录的 x 轴。当我使用 scale_x_log10() 仅对正数执行此操作时,它就像一个魅力。但在这里它没有,它要么删除我的负数,要么将它们添加到正数中。
ggplot(df, aes(x = x)) + geom_histogram() + scale_x_log10()

我真正想要的是刻度和刻度之间的间距遵循对数模式,并且 x 轴上 0 的任一侧都是彼此的镜像,但我似乎无法理解。

最佳答案

这可以通过定义一个新的转换来实现(一个“签名日志”, sign(x)*log(abs(x))asinh transformation 建议的 Histogram with "negative" logarithmic scale in R 可能更有原则,或者上面评论中建议的有符号平方根),但我怀疑这是否是一个好主意或不。尽管如此......(“教一个人钓鱼,你养他一辈子;给他一根绳子,他可以上吊……”)......你可以通过 trans_new 定义你自己的轴变换,如下所示.

设置:

library(ggplot2); theme_set(theme_bw())
set.seed(101)
df <- data.frame(x=rnorm(5000,0,1000))

设置新的转换:
weird <- scales::trans_new("signed_log",
       transform=function(x) sign(x)*log(abs(x)),
       inverse=function(x) sign(x)*exp(abs(x)))

试试看——首先是原始点:
ggplot(df,aes(x,x))+geom_point()+
    scale_y_continuous(trans=weird)

r - 我需要ggplot scale_x_log10()为我提供负数和正数-LMLPHP

现在在直方图上:
ggplot(df, aes(x = x)) + geom_histogram()+
    scale_x_continuous(trans=weird)

r - 我需要ggplot scale_x_log10()为我提供负数和正数-LMLPHP

你应该担心的事情:
  • 当您的值介于 -1 和 1 之间时,此转换将是无意义的
  • 你可能不得不担心在不适当缩放 bin 高度的情况下转换直方图的轴:它可能会给你一个概率密度的误导性印象——尽管在这种情况下 ggplot(df, aes(x = weird$transform(x))) + geom_histogram() 看起来与上面的图大致相同......
  • 关于r - 我需要ggplot scale_x_log10()为我提供负数和正数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37446064/

    10-12 17:05