Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 我需要ggplot scale_x_log10()将负数和正数作为输出_R_Plot_Ggplot2_Histogram - Fatal编程技术网

R 我需要ggplot scale_x_log10()将负数和正数作为输出

R 我需要ggplot scale_x_log10()将负数和正数作为输出,r,plot,ggplot2,histogram,R,Plot,Ggplot2,Histogram,我在这里生成了一个包含正数和负数的精细直方图 x <- rnorm(5000,0,1000) library(ggplot2) df <- data.frame(x) ggplot(df, aes(x = x)) + geom_histogram() 我真正想要的是记号和记号之间的间距遵循对数模式,并且x轴上0的任一侧是彼此的镜像,但我似乎无法得到 这可以通过定义一个新的转换来实现(一个“有符号的日志”、符号(x)*log(abs(x));建议的可能更具原则性,或者如上面的评论中

我在这里生成了一个包含正数和负数的精细直方图

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


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

这可以通过定义一个新的转换来实现(一个“有符号的日志”、
符号(x)*log(abs(x))
;建议的可能更具原则性,或者如上面的评论中所建议的一个有符号的平方根),但我怀疑这是否是一个好主意。然而(“教一个人钓鱼,你就可以养活他一辈子;给他一根绳子,他就可以上吊了……”。。。您可以通过
trans\u new
定义自己的轴变换,如下所示

设置:

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

现在看直方图:

ggplot(df, aes(x = x)) + geom_histogram()+
    scale_x_continuous(trans=weird)

你应该担心的事情:

  • 当值介于-1和1之间时,这种转换将是毫无意义的
  • 您可能需要担心在不适当缩放仓位高度的情况下变换直方图的轴:这可能会给您一个概率密度的误导性印象——尽管在这种情况下,
    ggplot(df,aes(x=wird$transform(x))+geom_histogram()
    看起来与上面的图大致相同

你不能取负数的对数,这就是为什么ggplot会切断你的轴。这个答案可能会有帮助:也许一个有符号的平方根会是一个更合适的变换?@MhairiMcNeill很遗憾,我已经读过了,但没有读到。谢谢anyway@MichaelGao,我明白了,但我觉得应该有一个同等的东西来让情节看起来像我想要的那样。我看过这样的情节,但我不知道如何得到它们。谢谢。当我尝试将此应用于在复杂数据帧中调用列的某些代码时,$在
中给出了一个错误,很抱歉,但这还不足以解决您的问题。如果您只想在GGPUT之外进行转换(更简单),定义<代码> SigndLog,我也会考虑在转换中使用<代码> Log1P< <代码>和<代码> ExpM1<代码>。
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)