绘制多个ggplot数据线在gtable_matrix(Draw a line across mul

2019-09-28 16:47发布

我想提请跨越两个ggplot的柱状图,线在gtable_matrix,所以,在一个直方图中的值的平均值,跨两个地块覆盖。

不过,我不能在绘图区域的设备坐标得到。 在基地的图形,我会用grconvertX(),但我在哪里可以找到ggplot的绘图区域的设备坐标,所以我可以在我的“用户”规模(0-10)将数字转换成设备坐标?

在下面的例子中,我发现了精心的数字插上获得在正确的位置线,但只要该地块重新调整,或轴标签更改,或任何其他剧情元素的变化,它打破了。 如预期你的机器上是很可能将无法正常工作。

library(ggplot2)
library(grid)
library(gtable)

n_1 = 10
n_2 = 10
mean_1 = 5.5
sd_1 = 1
mean_2 = 7
sd_2 = 1
data = data.frame(y = c(
  rnorm(n_1, mean_1, sd_1),
  rnorm(n_2, mean_2, sd_2)
),
group = c(rep("1", n_1), rep("2", n_2)))
data$y[data$y > 10] <- 10
data$y[data$y < 0] <- 0

plots <- lapply(c("1", "2"), function(x) {
  ggplotGrob(
    ggplot(data[data$group == x,], aes(y)) +
      geom_histogram(
        breaks = seq(0, 10, length.out = 12),
        fill = ifelse(x == "1", "blue", "red"),
        colour = "black",
        alpha = .2
      ) +
      theme_classic() +
      theme(axis.title.x = element_blank()) +
      ylab(x) +
      scale_x_continuous(expand = c(0, 0), limits = c(0, 10)) +
      scale_y_continuous(expand = c(0, 0), limits = c(0, 4))
  )

})

gt <- gtable_matrix(
  "histograms",
  matrix(plots, nrow = 2, byrow = TRUE),
  widths = unit(1, "null"),
  heights = unit(c(1, 1), "null")
)

left <- textGrob("Frequency", rot = 90, just = c(.5, .5))
gt <-
  gtable_add_cols(gt, widths = grobWidth(left) + unit(0.5, "line"), 0)
gt <- gtable_add_grob(
  gt,
  left,
  t = 1,
  b = nrow(gt),
  l = 1,
  r = 1,
  z = Inf
)

gt <- gtable_add_cols(gt, widths = unit(0.5, "line"))
grid.newpage()
grid.draw(gt)

pushViewport(viewport())

grid.lines(y = c(.05, .98),
           x = (.11 + (5 / 10 * .861)),
           gp = gpar(col = "red"))
popViewport()

Answer 1:

下面是与面的精简版本。 你可以决定这是否足以实现你在找什么砸gtable东西。

使用geom_vline设置为你的y值的平均值的拦截; 这将会把它在每个方面相同的地方。 我拿出带文本( strip.text = element_blank()来模仿你有删除这两个地块的标题做了什么。 除此之外,它只是一个标准的facet_wrap的群体。

library(tidyverse)

n_1 = 10
n_2 = 10
mean_1 = 5.5
sd_1 = 1
mean_2 = 7
sd_2 = 1
data = data.frame(y = c(
  rnorm(n_1, mean_1, sd_1),
  rnorm(n_2, mean_2, sd_2)
),
group = c(rep("1", n_1), rep("2", n_2)))
data$y[data$y > 10] <- 10
data$y[data$y < 0] <- 0

ggplot(data, aes(x = y, fill = group)) +
  geom_histogram(breaks = seq(0, 10, length.out = 12)) +
  geom_vline(aes(xintercept = mean(y))) +
  facet_wrap(~ group, ncol = 1) +
  theme_minimal() +
  theme(strip.text = element_blank())



文章来源: Draw a line across multiple ggplot figures in a gtable_matrix