gpt4 book ai didi

r - 自定义缩放轴后ggplot2缺少标签

转载 作者:行者123 更新时间:2023-12-04 12:26:42 29 4
gpt4 key购买 nike

我正在尝试使用 ggplot2 应用我的 x 轴的自定义缩放比例和 scales::trans_new() .但是,当我做一些轴标签时会丢失。有人可以帮我弄清楚原因吗?

设置:

library(tidyverse)

# the data
ds <- tibble(
myx = c(1, .5, .1, .01, .001, 0),
myy = 1:6
)

# the custom transformation
forth_root_trans_rev <- scales::trans_new(
name = "sign_fourth_root_rev",
transform = function (x) { - abs(x)^(1/4) },
inverse = function (x) { x^4 }
)

情节 1:

当我尝试绘制此标签时 x = 0迷路。
# plot - missing x-label at `0`
ggplot(ds, aes(x = myx, y = myy)) +
geom_line() +
geom_point() +
scale_x_continuous(
trans = forth_root_trans_rev,
breaks = sort(unique(ds$myx)),
)

missing x-label at <code>0</code>

地块 2

当我在图的两侧添加一些空间时,会丢失更多的 x 标签。
# plot - missing x-labels below 0.5
ggplot(ds, aes(x = myx, y = myy)) +
geom_line() +
geom_point() +
scale_x_continuous(
trans = forth_root_trans_rev,
breaks = sort(unique(ds$myx)),
expand = expand_scale(mult = c(.1, .6))
)

missing x-labels below 0.5

我认为这与这个旧问题有关: https://github.com/tidyverse/ggplot2/issues/980 .尽管如此,我无法弄清楚如何应用这种转换并保留所有 x 标签。

我哪里错了?

最佳答案

这里的问题是由于两个因素的组合:

  • 您的 x 轴值(转换后)落在 [-1, 0] 范围内,因此任何扩展(无论是加法还是乘法)都会插入最终范围以涵盖正值和负值。
  • 您的自定义转换在 [<some negative number>, <some positive number>] 区域中不是一对一的。

  • 它是如何发生的

    在用于构建 ggplot 对象的所有代码深处的某个地方(您可以在打印绘图之前运行 ggplot2:::ggplot_build.ggplot 并步入 layout$setup_panel_params() ,但我不建议普通用户使用它......兔子洞真的很深),x -axis 中断按以下方式计算:
  • 获取转换值的限制(对于问题中的 c(1, .5, .1, .01, .001, 0),这将是 (-1, 0) )。
  • 如果适用,将扩展添加到限制(连续轴的默认扩展在任一侧为 5%,因此限制变为 (-1.05, 0.05) )。
  • 对限制应用逆变换(在限制上取 x^4 产生 (1.215506, 0.000006) )。
  • 对用户输入的两个中断和限制应用转换(对于中断, c(1, .5, .1, .01, .001, 0) 变为 (-1.0000000, ..., 0.0000000) ,但对于限制, (1.215506, 0.000006) 现在变为 (-1.05, -0.05) ,即 0x109045 70x10459104045914)。
  • 超出限制范围的突破被丢弃(因为现在限制停在 -0.05,0 处的突破被丢弃)。

  • 如何解决这个问题

    您可以使用 (-1.05, 0.05) 修改您的转换以保留正/负值,以便转换在整个范围内是一对一的,正如 Hadley 在您链接的 GH 问题的讨论中所建议的那样。例如:
    # original
    forth_root_trans_rev <- scales::trans_new(
    name = "sign_fourth_root_rev",
    transform = function (x) { - abs(x)^(1/4) },
    inverse = function (x) { x^4 }
    )

    # new
    forth_root_trans_rev2 <- scales::trans_new(
    name = "sign_fourth_root_rev",
    transform = function (x) { -sign(x) * abs(x)^(1/4) },
    inverse = function (x) { -sign(x) * abs(x)^4 }
    )

    library(dplyr)
    library(tidyr)

    # comparison of two transformations
    # y1 shows a one-to-one mapping in either (-Inf, 0] or [0, Inf) but not both;
    # y2 shows a one-to-one mapping in (-Inf, Inf)
    data.frame(x = seq(-1, 1, 0.01)) %>%
    mutate(y1 = x %>% forth_root_trans_rev$transform() %>% forth_root_trans_rev$inverse(),
    y2 = x %>% forth_root_trans_rev2$transform() %>% forth_root_trans_rev2$inverse()) %>%
    gather(trans, y, -x) %>%
    ggplot(aes(x, y, colour = trans)) +
    geom_line() +
    geom_vline(xintercept = 0, linetype = "dashed") +
    facet_wrap(~trans)

    comparison plot

    用法
    p <- ggplot(ds, aes(x = myx, y = myy)) + 
    geom_line() +
    geom_point() +
    theme(panel.grid.minor = element_blank())

    p +
    scale_x_continuous(
    trans = forth_root_trans_rev2,
    breaks = sort(unique(ds$myx))
    )
    p +
    scale_x_continuous(
    trans = forth_root_trans_rev2,
    breaks = sort(unique(ds$myx)),
    expand = expand_scale(mult = c(.1, .6)) # with different expansion factor, if desired
    )

    plots

    关于r - 自定义缩放轴后ggplot2缺少标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130614/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com