ggplot使用facet_wrap指定布局时如何去除多余布局序号
问题描述
我使用ggplot的facet_wrap绘制分面图时,为了指定分面布局编写了如下代码:
df$layout_order <- factor(rep(1:ceiling(nrow(df)/4), each = 4), levels = unique(rep(1:ceiling(nrow(df)/4), each = 4))[1:nrow(df)]) ggplot(df, aes(x = Time, y = nPVI, group = Time, fill = Group)) + geom_bar(stat = "identity", position = "dodge", color = "black") + labs(title = "nPVI scores by Participant, Time and Group", x = "Time", y = "nPVI", group = "Time") + facet_wrap(~ Participant + layout_order, scales = "free", ncol = 4)+ coord_cartesian(ylim = c(20, 60)) + scale_fill_manual(values = c("Oral" = "#86CB92", "Prosody" = "#0E7C7B")) + theme_minimal()
代码实现了布局指定功能,但每个分面顶部的参与者(Participant)名称下方会显示布局序号,请问如何去除这些多余序号?
解决方法
要去掉这些多余的布局序号,试试这两种实用方法:
方法1:自定义分面标签,只保留参与者名称
在facet_wrap里添加labeller参数,用自定义函数把layout_order对应的标签内容删掉即可:
# 自定义标签函数,移除layout_order的标签列 custom_label <- function(labels) { labels$layout_order <- NULL labels } ggplot(df, aes(x = Time, y = nPVI, group = Time, fill = Group)) + geom_bar(stat = "identity", position = "dodge", color = "black") + labs(title = "nPVI scores by Participant, Time and Group", x = "Time", y = "nPVI", group = "Time") + facet_wrap(~ Participant + layout_order, scales = "free", ncol = 4, labeller = custom_label) + coord_cartesian(ylim = c(20, 60)) + scale_fill_manual(values = c("Oral" = "#86CB92", "Prosody" = "#0E7C7B")) + theme_minimal()
方法2:调整参与者的因子顺序,无需引入layout_order到分面
直接把Participant的因子顺序设置为你想要的布局顺序,这样facet_wrap只按Participant分面,自然不会出现多余序号:
# 按layout_order的逻辑生成Participant的显示顺序 participant_order <- df$Participant[order(df$layout_order)] # 将Participant转换为因子并指定顺序 df$Participant <- factor(df$Participant, levels = unique(participant_order)) ggplot(df, aes(x = Time, y = nPVI, group = Time, fill = Group)) + geom_bar(stat = "identity", position = "dodge", color = "black") + labs(title = "nPVI scores by Participant, Time and Group", x = "Time", y = "nPVI", group = "Time") + facet_wrap(~ Participant, scales = "free", ncol = 4) + coord_cartesian(ylim = c(20, 60)) + scale_fill_manual(values = c("Oral" = "#86CB92", "Prosody" = "#0E7C7B")) + theme_minimal()
这两种方法都能保留你想要的布局效果,同时分面顶部只显示参与者名称,不会再出现多余的布局序号。
内容的提问来源于stack exchange,提问作者Lucie J.
相关产品推荐
相关产品推荐

