如何在函数ggplot中添加子图?

How to add subplots in a function ggplot?

提问人:Joe the Second 提问时间:9/28/2023 最后编辑:Joe the Second 更新时间:9/28/2023 访问量:64

问:

我有以下数据集,它基本上是一个有 3 列的数据框

column_A <- rep(sample(300:1000000, 903, replace = F), each=10)
column_B <- sample(5:25, 9030, replace = T)

df <- data.frame(column_A, column_B)
df$group <- sample(1:4, nrow(df), replace = T)
rm(column_A)
rm(column_B)

我想使用以下代码使用 geom.point() 生成一个图形:

graph_builder <- function(data_set, y_axis_parameter, category, group) {
 
  graph <- ggplot(data_set, aes(x = factor({{category}}), y = {{ y_axis_parameter }})) +
    geom_point() +
    theme(plot.title = element_text(hjust = 0.5)) +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + 
    facet_grid(rows = vars({{ group }}), scales = "free_x") 
  
  graph
}

graph_builder(df, column_B, column_A, group )

使用我的真实数据集,类似于生成的数据框,我正在处理 x 轴的大量类别(接近 900),因此 x 轴上的值变得局促且不可读。我想让我的图表更具可读性。

我的解决方案:我正在向数据框中添加一个名为“group”的新列,并分配从 1 到 4 的数值。这会将大致相等数量的数据点分配给这四个组(1、2、3 和 4)中的每一个。但正如您在代码中看到的那样,我正在添加这个新列,用于在 grpah_builder() 函数之外分配分组。

我认为一定有一种更好的方法可以将我的数据帧划分为四个(或 5 个)子组,这样最终的图形就有四个子图。值得一提的是,在我的实际数据帧中,x 轴上的值不遵循均匀分布,这在使用该函数时会产生不同的组大小。看看这个解决方案cut()

enter image description here

问题 1:有没有办法在 graph_builder() 函数中划分我的数据集?正如你所看到的,我的代码生成的图形是不可读的,任何使其更具可读性的解决方案都非常值得赞赏。

r ggplot2 子图 分面网格

评论

0赞 Jon Spring 9/28/2023
是否打算拆分数据,以便每个子图中只需要显示 1/4 或 1/5 的column_A值?如果是这样,您应该根据column_A值而不是随机拆分组,并且可能用于拆分轴标签。facet_wrap(vars({{group}}), scales = "free_x")
0赞 Joe the Second 9/28/2023
@JonSpring感谢您的评论。是的,这是正确的。我的目的是拆分数据,以便在第一个子图中仅显示 1/4 的column_A。你有什么建议吗 如何根据 graph_builder() 中的column_A进行拆分?甚至以有效的方式在功能之外?我也尝试过facet_wrap()。它做了一些改进,但不能解决问题。图形仍然不可读。

答:

3赞 Jon Spring 9/28/2023 #1

你问的是你的 x 轴的英雄主义。在这个版本中,我按类别值的顺序将图表拆分为 6 个方面。这只是勉强可读的,但对我来说并不明显,没有更大的格式可以做得更好。也许是IMAX?

在这里,我将类别转换为因子并将其转换为数字,因此范围从第一个值的 1 到最后一个值的 903。然后,我们可以通过一些数学运算将组~均匀地分开。num_catcolumn_A

graph_builder <- function(data_set, y_axis_parameter, category) {
    
  data_set <- data_set %>%
    mutate(num_cat = as.numeric(factor({{category}})),
           group = floor(num_cat*6/max(num_cat + 1))) 
    
  ggplot(data_set, aes(x = factor({{category}}), y = {{ y_axis_parameter }})) +
    geom_point() +
    theme(plot.title = element_text(hjust = 0.5)) +
    theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) + 
    theme(strip.background = element_blank(), strip.text = element_blank()) +
    facet_wrap(vars(group), scales = "free_x", nrow = 6) 
  }

graph_builder(df, column_B, column_A )

enter image description here

评论

0赞 Allan Cameron 9/28/2023
“也许是IMAX?”让我笑了。这似乎有很多问题适用于此。在我看来,这似乎是对情节的根本误解。期望一个情节上的这么多标签在任何方面都是有用的是错误的(即使它是在IMAX上)。很高兴看到它被拉出来以清楚地说明这一点。
1赞 Jon Spring 9/28/2023
我称之为.theme_phonebook()