【问题标题】:Add reverse log transformation to binned scale on ggplot2将反向对数转换添加到 ggplot2 上的分箱比例
【发布时间】:2022-12-03 11:15:21
【问题描述】:

我的情节有一些限制:

  • x axis 应该是反转的和对数的
  • y axis 应该装箱,但是:
    • bins 应该以相反的顺序显示
    • bins 大小应该有对数刻度或类似的东西(0-10 bin 应该大于10-20,等等)
  • 对于xy0刻度应该出现在轴上(我们通常用limits=c(0, 0)实现)

这是一些示例数据:

set.seed(123)
dat <- data.frame(
    a=sample(seq(0, 100), 1e4, replace=TRUE), 
    b=sample(1e6, 1e4), 
    t=sample(letters[seq(2)], 1e4, replace=TRUE)
)

我可以在x 轴上实现大部分约束,在y 上实现一些约束:

dat |> ggplot(aes(y=a, x=b, colour=t)) + 
    geom_jitter() + 
    scale_x_continuous(
        trans=c("log10", "reverse"), 
        breaks=seq(0, 6) |> purrr::map(~c(2.5, 5, 10)*10^.x) |> unlist(), 
        expand=c(0, 0)
    ) + 
    scale_y_binned(expand=c(0, 0), limits=c(0, 100)) +
    ggthemes::theme_clean()

这里缺少的是:

  • 0 tick on x:使用limits=c(0, 100)log比例产生错误。使用 scales::pseudo_log_trans 而不是 scales::log10 不起作用。我尝试使用 ggallin::pseudolog10_trans,它也保留 0 和负数,但不知道如何将它与另一个变压器混合。
  • y 轴上的对数刻度。这里的问题是scale_y_binned将数据离散化,log transformation只能应用于连续数据。
  • 反转y轴。这里的问题是相似的,因为反转轴不仅仅是 ggplot2 的整容操作,就像 coord_flip 一样;它实际上也是一种需要连续数据的转换。

干杯!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    也许最简单的方法是手动对比例进行分箱,并使用连续的而不是带有自定义标签的分箱 y 比例:

    dat |>
      within(abin <- cut(a, c(0, 10^seq(0, 2, 0.25)), include.lowest = TRUE,
                         right = FALSE, 
                         labels = seq(-0.1072541, by = 0.25, len = 9)))|>
      within(abin <- as.numeric(as.character(abin))) |>
      ggplot(aes(y = abin, x = log10(b + 1), colour = t)) + 
      geom_jitter() + 
      scale_x_reverse(breaks = c(log10(c(5e5, 25e4, 1e5, 5e4, 25e3, 1e4, 5e3,
                                       25e2, 1e3, 5e2, 250, 100, 50, 10)+1), 0.3),
                      limits = c(6, 0.3), expand = c(0, 0), name = "b",
                      labels = ~c(head(comma(10^(.x) - 1), -1), 0)) + 
      scale_y_reverse('a', breaks = seq(-0.25, 2, 0.25),
                      labels = ~ c(0, round(10^(tail(.x, -1))))) +
      ggthemes::theme_clean()
    

    【讨论】:

    • 谢谢,我绝对可以以此为基础。如果您对“在两个轴上显示 0 刻度”有任何线索,我将非常乐意接受您的回答。
    • @Vongo 查看我的更新
    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 2019-08-04
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2016-06-16
    • 2018-05-11
    相关资源
    最近更新 更多