gpt4 book ai didi

r - 双 y 轴和 facet_wrap

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

How can I put a transformed scale on the right side of a ggplot2?它展示了如何通过操纵和合并 ggplot2 对象与 gtable 在同一图中添加两个 y 轴。
从那里的示例中,我设法将其扩展为与 facet_wrap 一起使用。请参阅下面的示例。

然而,有三件事并不完美。

  • 秤总是放在最右边。最好能和最后一行的情节联系起来
  • 如果所有图上都分别有 y 轴,则它不起作用(即您将 scales="free_y" 放入 facet_wrap )
  • 如果我将网格线留在(被注释掉的行)中,第二个图的网格线出现在第一个图的前面。

  • 有什么想法可以解决这些公认的小问题吗?
    library(ggplot2)
    library(gtable)
    library(grid)

    p1 <- ggplot(diamonds, aes(y=carat,x=price))
    p1 <- p1 + geom_point(color="red")
    p1 <- p1 + facet_wrap(~ color)
    p1 <- p1 + theme_bw() %+replace% theme(panel.background = element_rect(fill = NA)) # use white theme and set bg to transparent so they can merge nice
    #p1 <- p1 + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) # remove gridlines
    p1


    p2 <- ggplot(diamonds, aes(x=price))
    p2 <- p2 + geom_histogram( binwidth = 1000)
    p2 <- p2 + facet_wrap(~ color)
    p2 <- p2 + theme_bw() %+replace% theme(panel.background = element_rect(fill = NA))
    #p2 <- p2 + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

    p2



    ## Putting plots together ##################
    # extract gtable
    g1 <- ggplot_gtable(ggplot_build(p1))
    g2 <- ggplot_gtable(ggplot_build(p2))

    # overlap the panel of 2nd plot on that of 1st plot
    pp <- c(subset(g1$layout, grepl("panel",name) , se = t:r))
    g <- gtable_add_grob(g1, g2$grobs[grep("panel",g2$layout$name)], pp$t,
    pp$l, pp$b, pp$l)



    # axis tweaks
    ia <- which(grepl("axis_l",g2$layout$name) | grepl("axis-l",g2$layout$name) )
    ga <- g2$grobs[ia]


    axis_idx <- as.numeric(which(sapply(ga,function(x) !is.null(x$children$axis))))

    for(i in 1:length(axis_idx)){
    ax <- ga[[axis_idx[i]]]$children$axis
    ax$widths <- rev(ax$widths)
    ax$grobs <- rev(ax$grobs)
    ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
    g <- gtable_add_cols(g, g2$widths[g2$layout[ia[axis_idx[i]], ]$l], length(g$widths) - 1)
    g <- gtable_add_grob(g, ax, pp$t[axis_idx[i]], length(g$widths) - i, pp$b[axis_idx[i]])
    }



    # Plot!
    grid.newpage()
    grid.draw(g)

    facet_wrap with dual axis

    最佳答案

    这是一个调整,您应该能够进一步调整以满足您的要求。制定出更精确和更通用的东西会花费我比我现在离开的时间更多的时间。但我认为你会毫不费力地采取额外的步骤。

    前几步没有变化。

    在这里,我复制了顶部 2 个行面板的程序,而不是在底部重新添加调整后的轴:

    # do not add back the bottom lhs axis
    for(i in 1:(length(axis_idx)-1)) {
    ax <- ga[[axis_idx[i]]]$children$axis
    ax$widths <- rev(ax$widths)
    ax$grobs <- rev(ax$grobs)
    ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
    g <- gtable_add_cols(g,
    g2$widths[g2$layout[ia[axis_idx[i]], ]$l], length(g$widths) - 1)
    g <- gtable_add_grob(g,
    ax, pp$t[axis_idx[i]], length(g$widths) - i, pp$b[axis_idx[i]])
    }

    在这里,我单独处理底行。这是我没有概括的地方。您需要稍微调整刻度和垂直轴之间的距离。对于底部只有一个图、2 个图等的情况,您还需要概括索引。
    # Here I fix the index ``i`` to 3, to cater for your example.
    i <- length(axis_idx)
    ax <- ga[[axis_idx[i]]]$children$axis
    ax$widths <- rev(ax$widths)
    ax$grobs <- rev(ax$grobs)
    ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm")
    g <- gtable_add_cols(g, g2$widths[3], 12)
    g <- gtable_add_grob(g, ax, pp$t[axis_idx[i]], length(g$widths) - 9, pp$b[axis_idx[i]])

    需要概括的位是数字 12 和 9。可能需要调整的位是带有 unit(0.15, "cm") 的那一行。获得比目前更多的空间。

    从您的 g 开始对象有宽度 12 ,即 3 x 3 面板加 3 个垂直轴。然后添加一列来满足第二个轴的需求,得到的宽度为 15 .数字 12 被选择在底部图的 rhs 上。选择数字 9 将第二个轴放置在那里。我认为。

    enter image description here

    关于r - 双 y 轴和 facet_wrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30103408/

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