【问题标题】:I need ggplot scale_x_log10() to give me both negative and positive numbers as output我需要 ggplot scale_x_log10() 给我负数和正数作为输出
【发布时间】:2016-05-25 19:31:10
【问题描述】:

我在这里生成了一个带有正数和负数的精细直方图。

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 的任一侧都是彼此的镜像,但我似乎无法理解。

【问题讨论】:

  • 你不能取负数的对数,这就是为什么 ggplot 会切断你的轴。
  • 这个答案可能会有所帮助:stackoverflow.com/questions/14504869/…
  • 带符号的平方根可能是更合适的转换方式?
  • @MhairiMcNeill 可悲的是,我已经读过了,但没有。还是谢谢
  • @MichaelGao,我明白了,但我觉得应该有一个等效的东西来让情节看起来像我想要的那样。我见过这样的情节,但我不知道如何得到它们。

标签: r plot ggplot2 histogram


【解决方案1】:

这可以通过定义一个新的转换来实现(“签名日志”,sign(x)*log(abs(x))Histogram with "negative" logarithmic scale in R 建议的asinh transformation 可能更有原则,或者上面 cmets 中建议的签名平方根) ,但我怀疑这是否是个好主意。尽管如此......(“教一个人钓鱼,你养他一辈子;给他一根绳子,他可以上吊......”)......你可以通过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)

你应该担心的事情:

  • 当您的值介于 -1 和 1 之间时,这种转换将是荒谬的
  • 您可能不得不担心在没有适当缩放 bin 高度的情况下转换直方图的轴:它可能会给您一种概率密度的误导印象——尽管在这种情况下 ggplot(df, aes(x = weird$transform(x))) + geom_histogram() 看起来与上面的图大致相同。 ..

【讨论】:

  • 谢谢。当我尝试将此应用于我在复杂数据框中调用列的某些代码时,$ 在代码的 weird &lt;- scales::trans_new("signed_log", transform=function(x) sign(x)*log(abs(x)), inverse=function(x) sign(x)*exp(abs(x))) 部分中给出错误
  • 很抱歉,这些信息不足以让我解决您的问题。如果您只想在 ggplot 之外进行转换(这会更简单),请定义 signedlog &lt;- function(x) sign(x)*log(abs(x))
  • 我也会考虑在转换中使用log1pexpm1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多