我在这里生成了一个带有正数和负数的精细直方图。
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)
现在在直方图上:
ggplot(df, aes(x = x)) + geom_histogram()+
scale_x_continuous(trans=weird)
你应该担心的事情:
ggplot(df, aes(x = weird$transform(x))) + geom_histogram()
看起来与上面的图大致相同...... 关于r - 我需要ggplot scale_x_log10()为我提供负数和正数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37446064/