gpt4 book ai didi

r - 如何将单独的coord_cartesian()应用于 "zoom in"到facet_grid()的各个面板中?

转载 作者:行者123 更新时间:2023-12-04 08:51:08 25 4
gpt4 key购买 nike

受Q Finding the elbow/knee in a curve的启发,我开始玩smooth.spline()

特别是,我想可视化参数df(自由度)如何影响近似值以及一阶和二阶导数。请注意,此Q值不是近似值,而是ggplot2可视化中的特定问题(或边缘情况)。

第一次尝试:简单的facet_grid()

library(ggplot2)
ggplot(ap, aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw()

facet_grid
dp是一个data.table,包含要寻找其近似值的数据点, ap是一个data.table,其中包含近似数据和导数(数据在下面给出)。

对于每一行, facet_grid()scales = "free_y"已选择一个显示所有数据的标度。不幸的是,一个面板具有某种“离群值”,这使得很难在其他面板中看到细节。所以,我想“放大”。

使用 coord_cartesian()“放大”
ggplot(ap, aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw() +
coord_cartesian(ylim = c(-200, 50))

enter image description here

使用手动选择的范围,第3行的面板中的更多详细信息将变得可见。但是,该限制已应用于网格的所有面板。因此,在第1行中,几乎无法区分细节。

我正在寻找的是一种将带有特定参数的coord_cartesian()分别应用于网格的每个单独面板(或一组面板,例如按行)的方法。例如,之后是否可以操作ggplot对象?

解决方法:将单独的图与 cowplot合并

解决方法是,我们可以创建三个单独的图,然后使用 cowplot包将它们组合起来:
g0 <- ggplot(ap[deriv == 0], aes(x, y)) +
geom_point(data = dp, alpha = 0.2) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw()

g1 <- ggplot(ap[deriv == 1], aes(x, y)) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw() +
coord_cartesian(ylim = c(-50, 50))

g2 <- ggplot(ap[deriv == 2], aes(x, y)) +
geom_line() +
facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
theme_bw() +
coord_cartesian(ylim = c(-200, 100))

cowplot::plot_grid(g0, g1, g2, ncol = 1, align = "v")

enter image description here

不幸的是,这种解决方案
  • 需要编写代码来创建三个单独的图
  • 复制 strip 和轴,并添加空白,这些空白不可用于显示数据。
  • facet_wrap()是否可以替代?

    我们可以使用 facet_wrap()代替 facet_grid():
    ggplot(ap, aes(x, y)) +
    # geom_point(data = dp, alpha = 0.2) + # this line causes error message
    geom_line() +
    facet_wrap(~ deriv + df, scales = "free_y", labeller = label_both, nrow = 3) +
    theme_bw()

    enter image description here

    现在,每个面板的y轴都按比例缩放,以显示某些面板的详细信息。不幸的是,我们仍然无法“放大”右下角的面板,因为使用 coord_cartesian()会影响所有面板。

    另外,线
    geom_point(data = dp, alpha = 0.2)

    奇怪的原因

    Error in gList(list(x = 0.5, y = 0.5, width = 1, height = 1, just = "centre", : only 'grobs' allowed in "gList"



    我不得不对此行进行注释,因此不会显示要近似的数据点。

    数据
    library(data.table)
    # data points
    dp <- data.table(
    x = c(6.6260, 6.6234, 6.6206, 6.6008, 6.5568, 6.4953, 6.4441, 6.2186,
    6.0942, 5.8833, 5.7020, 5.4361, 5.0501, 4.7440, 4.1598, 3.9318,
    3.4479, 3.3462, 3.1080, 2.8468, 2.3365, 2.1574, 1.8990, 1.5644,
    1.3072, 1.1579, 0.95783, 0.82376, 0.67734, 0.34578, 0.27116, 0.058285),
    y = 1:32,
    deriv = 0)
    # approximated data points and derivatives
    ap <- rbindlist(
    lapply(seq(2, length(dp$x), length.out = 4),
    function(df) {
    rbindlist(
    lapply(0:2,
    function(deriv) {
    result <- as.data.table(
    predict(smooth.spline(dp$x, dp$y, df = df), deriv = deriv))
    result[, c("df", "deriv") := list(df, deriv)]
    })
    )
    })
    )

    最佳答案

    答案很晚,但是以下hack只是发生在我身上。它适用于您的用例吗?

    步骤1 。创建预期图的替代版本,限制y值的范围,以便scales = "free_y"为每个构面行提供所需的比例范围。还要创建具有完整数据范围的预期构面图:

    library(ggplot2)
    library(dplyr)

    # alternate plot version with truncated data range
    p.alt <- ap %>%
    group_by(deriv) %>%
    mutate(upper = quantile(y, 0.75),
    lower = quantile(y, 0.25),
    IQR.multiplier = (upper - lower) * 10) %>%
    ungroup() %>%
    mutate(is.outlier = y < lower - IQR.multiplier | y > upper + IQR.multiplier) %>%
    mutate(y = ifelse(is.outlier, NA, y)) %>%

    ggplot(aes(x, y)) +
    geom_point(data = dp, alpha = 0.2) +
    geom_line() +
    facet_grid(deriv ~ df, scales = "free_y", labeller = label_both) +
    theme_bw()

    # intended plot version with full data range
    p <- p.alt %+% ap

    步骤2 。使用 ggplot_build()生成两个ggplot对象的绘图数据。将alt版本的面板参数应用到预期版本:
    p <- ggplot_build(p)
    p.alt <- ggplot_build(p.alt)

    p$layout$panel_params <- p.alt$layout$panel_params
    rm(p.alt)

    步骤3 。从修改后的绘图数据构建所需的绘图,并绘图结果:
    p <- ggplot_gtable(p)

    grid::grid.draw(p)

    plot

    注意:在此示例中,我通过将每个构面行中距上/下四分位数超过10 * IQR的所有值都设置为NA来截断数据范围。可以用定义异常值的任何其他逻辑来代替。

    关于r - 如何将单独的coord_cartesian()应用于 "zoom in"到facet_grid()的各个面板中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41536406/

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