我需要ggplot scale_x_log10()给我输出负数和正数

Jam*_*oyd 2 plot r histogram ggplot2

我在这里用正数和负数生成一个精细的直方图.

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

我想要的是记录x轴.当我只使用scale_x_log10()执行此正数时,它就像一个魅力.但在这里它没有,它要么删除我的负数将它们添加到正数.

ggplot(df, aes(x = x)) + geom_histogram() + scale_x_log10()
Run Code Online (Sandbox Code Playgroud)

所有我真正想要的是刻度线和刻度线之间的间距遵循对数模式,并且x轴上0的任一侧是彼此的镜像,但我似乎无法得到它.

Ben*_*ker 12

这可以通过定义一个新的转换来实现("签名日志" sign(x)*log(abs(x)); 直方图建议的asinh转换,R中的"负"对数标度可能更有原则,或者如上面评论中建议的带符号的平方根),但我怀疑这是不是一个好主意.尽管如此......("教一个男人钓鱼,你喂他一辈子;给他一根绳子,他可以自己上吊......")......你可以通过trans_new如下图所示定义自己的轴变换.

建立:

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

建立新的转型:

weird <- scales::trans_new("signed_log",
       transform=function(x) sign(x)*log(abs(x)),
       inverse=function(x) sign(x)*exp(abs(x)))
Run Code Online (Sandbox Code Playgroud)

尝试一下 - 首先关注原始点:

ggplot(df,aes(x,x))+geom_point()+
    scale_y_continuous(trans=weird)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在在直方图上:

ggplot(df, aes(x = x)) + geom_histogram()+
    scale_x_continuous(trans=weird)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

你应该担心的事情:

  • 如果值介于-1和1之间,则此转换将是无意义的
  • 您可能不得不担心变换直方图的轴而不适当地缩放箱高:它可能会给您一个关于概率密度的误导性印象 - 尽管在这种情况下ggplot(df, aes(x = weird$transform(x))) + geom_histogram()看起来与上图相同...