ggplot2:space 轴在等距值之间不均匀地刻度

ggpot2: space axis ticks unevenly between equidistant values

我已经搜索过 SO 和其他在线资源,但无济于事。

有没有办法缩放轴,使 z 分数更好地反映从 0 到 1 和从 1 到 2(或任何其他等距分数)的实际差异?

如果我有一个 x 轴,其 z 分数范围从 -3 到 3 并且轴刻度在每个整数之间,有没有办法让那些更接近 0 的轴刻度比那些轴刻度更小更远?

示例:

-3        -2     -1  0  1      2          3
|----------|------|--|--|------|----------|

我是否遗漏了一些轴缩放方法,它既接受中断作为值,也接受中断相对于整个比例的位置?

编辑:

也许不完全是代表,但这是数据的结构和可视化的基本方法:

df <-
  data.frame(
    metric = c('metric1', 'metric2', 'metric3'),
    z_score = c(2, -1.5, 2.8)
  )

df %>%
  ggplot(aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  ylim(-4,4)

上面的代码生成了一个图,其中 z_score 轴具有均匀间隔的中断,而我希望中断 "pulled" 接近零,就像我在上面尝试绘制的那样。

你描述的好像是一个模数变换,但我不知道如何选择正确的参数来得到你想要的精确变换。

这是一个例子:

library(ggplot2)
library(scales)

df <- data.frame(
    metric = c('metric1', 'metric2', 'metric3'),
    z_score = c(2, -1.5, 2.8)
  )

ggplot(df, aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(trans = modulus_trans(2),
                     limits = c(-4, 4),
                     breaks = c(-3:3))

reprex package (v0.3.0)

于 2020-05-28 创建

技巧是使用新的 transformation 对象。 scales::中已经定义了几个,我发现最接近的(虽然在某种意义上是相反的)是:

ggplot(df, aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(trans=scales::pseudo_log_trans(0.2, 2),
                     limits = c(-3, 3), breaks = -3:3)

但是我认为你想要的是相反的扩展。由于看到 pseudo_log 相反的一种方法是 pseudo_exp,而我没有找到,这里是一个尝试:

pseudo_exp_trans <- function(pow = 2) {
  scales::trans_new(
    "pseudo_exp",
    function(x) sign(x) * abs(x^pow),
    function(x) sign(x) * abs(x)^(1/pow))
}

ggplot(df, aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(trans=pseudo_exp_trans(),
                     limits = c(-3, 3), breaks = -3:3)

只需使用 pow= 参数即可在轴上找到您想要的增长率。