gpt4 book ai didi

r - 在 facet_grid ggplot : x-axis labels differ per row 上强制 x 轴标签

转载 作者:行者123 更新时间:2023-12-04 20:21:24 27 4
gpt4 key购买 nike

我很高兴在帖子 中找到我的问题的大部分解决方案"Force X axis text on for all facets of a facet_grid plot " .

我想创建一个看起来有点像 OP Drew Steen 的图表,除了我有两行以上的刻面,我想让每行的 x 轴标签不同。

我根据@baptiste 的精彩回答做了一个 super hacky 的解决方案(主要是因为我不熟悉 gtable 包),我想知道:

  • 如果有比我在下面写的烂摊子更优雅的解决方案
  • 如何为“Premium”(中间)行插入标签。

  • 这是我改编自@Drew Steen 和@baptiste 的代码,
    library(ggplot2)

    diamondSub <-subset(diamonds, (cut=="Ideal" | cut=="Premium" | cut == "Very Good") & (color=="E" | color=="I"))

    p<- ggplot(diamondSub, aes(x=carat, y=price)) +
    geom_blank()+
    geom_point() +
    scale_x_discrete(breaks=c(1, 2, 3, 4), labels=c("a", "b", "c", "d")) +
    facet_grid(cut~color, scales="free_x")
    p

    p2<- ggplot(diamondSub, aes(x=carat, y=price)) +
    geom_blank()+
    geom_point() +
    scale_x_discrete(breaks=c(1, 2, 3, 4), labels=c("f", "g", "h", "i")) +
    facet_grid(cut~color, scales="free_x")
    p2

    library(gtable)

    g <- ggplotGrob(p)
    g2 <- ggplotGrob(p2)

    # locate the panels
    panels <- grep("panel", g$layout$name)
    panels2 <- grep("panel", g2$layout$name)

    top <- unique(g$layout$t[panels])
    top2 <- unique(g2$layout$t[panels2])
    # intersperse a copy of the bottom axes
    all <- gtable:::rbind_gtable(gtable:::rbind_gtable(g[seq.int(min(top)), ],
    g[max(top)+1,], "first"),
    g2[seq(min(top2)+1, nrow(g2)),], "first")
    grid.newpage()
    grid.draw(all)

    see graph

    最佳答案

    替代版本 (2015 年 4 月 24 日添加)显示元素的手动构造并包含更多评论。

    ## Alternative version
    library(gtable)
    library(grid)

    # Get the ggplot grobs
    g <- ggplotGrob(p)
    g2 <- ggplotGrob(p2)

    # Show the layout.
    # Note the rows and columns
    # In this case, the g2 layout is the same as the g layout
    gtable_show_layout(g)

    # The large panels are the plot panels.
    # We will need rows 4, 6 and 8.

    # For the top "Very Good" row, we will also need rows 1, 2, and 3.

    # The axis is located in row 9

    # Therefore rbind the grob in rows 1, 2, 3, and 4, with the grob in row 9.
    top.row <- rbind(g[1:4, ], g[9, ], size = "first")

    # The second "Premium" row
    # We need the panels in row 6 plus the small gap row above,
    # and rbind that to the axis
    middle.row = rbind(g2[5:6, ], g2[9,], size = "first")

    # The bottom "Ideal" row
    # We need the panel in row 8 plus the small gap in the row above
    # plus the axis in the row below
    # plus rows below that (axis label and margin)
    bottom.row = g2[7:11, ]


    # rbind the three rows
    all <- rbind(rbind(top.row, middle.row, size = "first"), bottom.row, size = "first")

    # Draw it
    grid.newpage()
    grid.draw(all)

    # Maybe add a little more space between the rows
    gtable_show_layout(all)
    all$heights[c(6,9)] = unit(1, "lines")

    # Draw it
    grid.newpage()
    grid.draw(all)

    但是您甚至不需要将面板绑定(bind)到轴;只需从布局中选择适当的行:
    top.row <- g[c(1:4, 9), ]
    middle.row = g2[c(5:6, 9), ]
    bottom.row = g2[7:11, ]

    然后绑定(bind)这三个新行。

    原版

    仅在绑定(bind)行时您犯了错误。您已将轴绑定(bind)到顶部的“非常好”行。底部的“理想”行已经有一个轴,因此不需要绑定(bind)。修复:中间的“Premium”行需要一个轴。

    我分别构建了每一行,将一个轴绑定(bind)到顶部和中间行,然后绑定(bind)三行。

    我添加了另一个步骤以在行之间添加更多空间。
    g <- ggplotGrob(p)
    g2 <- ggplotGrob(p2)

    # locate the panels
    panels <- grep("panel", g$layout$name)
    panels2 <- grep("panel", g2$layout$name)

    top <- unique(g$layout$t[panels])
    top2 <- unique(g2$layout$t[panels2])

    # Construct each row separately
    top.row <- gtable:::rbind_gtable(g[seq.int(min(top)), ], g[max(top)+1,], "first")
    middle.row <- gtable:::rbind_gtable(g2[c(top[2]-1,top[2]), ], g2[max(top)+1,], "first")
    bottom.row <- g2[(max(top2)-1):nrow(g2), ]

    all <- gtable:::rbind_gtable(gtable:::rbind_gtable(top.row, middle.row, "first"), bottom.row, "first")

    # Draw it
    grid.newpage()
    grid.draw(all)

    # Maybe add a little more space between the rows
    all$heights[c(6,9)] = unit(1, "lines")

    grid.newpage()
    grid.draw(all)

    enter image description here

    关于r - 在 facet_grid ggplot : x-axis labels differ per row 上强制 x 轴标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964545/

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