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)
你应该担心的事情:
ggplot(df, aes(x = weird$transform(x))) + geom_histogram()看起来与上图相同...