我在这里生成了一个包含正数和负数的精细直方图。
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))
; the 阿辛转型 https://en.wikipedia.org/wiki/Inverse_hyperbolic_function#asinh建议来自R 中具有“负”对数刻度的直方图 https://stackoverflow.com/questions/14504869/histogram-with-negative-logarithmic-scale-in-r可能更有原则性,或者如上面评论中建议的带符号的平方根),但我怀疑这是否是一个好主意。尽管如此......(“授人以鱼,你可以喂他一辈子;给他一根绳子,他可以上吊自杀......”)......你可以通过以下方式定义你自己的轴变换:trans_new
如下所示。
Setup:
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)
现在在直方图上:
ggplot(df, aes(x = x)) + geom_histogram()+
scale_x_continuous(trans=weird)
您应该担心的事情:
- 当你的值在 -1 到 1 之间时,这种转换将是无意义的
- 您可能需要担心在没有适当缩放箱高度的情况下变换直方图的轴:它可能会给您带来概率密度的误导性印象 - 尽管在这种情况下
ggplot(df, aes(x = weird$transform(x))) + geom_histogram()
看起来和上面的情节差不多……
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)