提问人:Joe the Second 提问时间:9/28/2023 最后编辑:Joe the Second 更新时间:9/28/2023 访问量:64
如何在函数ggplot中添加子图?
How to add subplots in a function ggplot?
问:
我有以下数据集,它基本上是一个有 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()
问题 1:有没有办法在 graph_builder() 函数中划分我的数据集?正如你所看到的,我的代码生成的图形是不可读的,任何使其更具可读性的解决方案都非常值得赞赏。
答:
3赞
Jon Spring
9/28/2023
#1
你问的是你的 x 轴的英雄主义。在这个版本中,我按类别值的顺序将图表拆分为 6 个方面。这只是勉强可读的,但对我来说并不明显,没有更大的格式可以做得更好。也许是IMAX?
在这里,我将类别转换为因子并将其转换为数字,因此范围从第一个值的 1 到最后一个值的 903。然后,我们可以通过一些数学运算将组~均匀地分开。num_cat
column_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 )
评论
0赞
Allan Cameron
9/28/2023
“也许是IMAX?”让我笑了。这似乎有很多问题适用于此。在我看来,这似乎是对情节的根本误解。期望一个情节上的这么多标签在任何方面都是有用的是错误的(即使它是在IMAX上)。很高兴看到它被拉出来以清楚地说明这一点。
1赞
Jon Spring
9/28/2023
我称之为.theme_phonebook()
评论
facet_wrap(vars({{group}}), scales = "free_x")