如何使用ggplot2不借助facet_wrap()复刻多面板折线图?
不用
facet_wrap()复刻多面板折线图的解决方案 要复刻目标图表但不能用facet_wrap(),核心思路是为每个产品单独生成图表,再手动拼接成多面板布局。下面用patchwork包(比gridExtra更简洁)来实现:
步骤1:加载依赖包和数据
library(tidyverse) library(patchwork) # 用于拼接图表 # 原数据保持不变 df <- tibble( produto = c( rep("Produto A", 3), rep("Produto B", 3), rep("Produto C", 2), rep("Produto D", 2), rep("Produto E", 2) ), ano = c(2008, 2010, 2014, 2008, 2010, 2014, 2010, 2014, 2011, 2014, 2013, 2014), preco = c(400, 300, 280, 420, 310, 290, 200, 230, 210, 220, 180, 250) )
步骤2:写一个批量生成单产品图表的函数
这个函数会自动筛选对应产品的数据,设置x轴仅显示该产品存在的年份,同时统一图表样式:
create_single_plot <- function(prod_name) { prod_data <- df %>% filter(produto == prod_name) ggplot(prod_data, aes(x = ano, y = preco, group = produto)) + geom_line(linewidth = 1) + geom_point(size = 2) + geom_text(aes(label = ano), vjust = -1.2, size = 3) + # 只显示当前产品的年份,实现x轴自由缩放 scale_x_continuous(limits = range(prod_data$ano), breaks = prod_data$ano) + scale_y_continuous(labels = scales::dollar_format(prefix = "$")) + labs(title = prod_name, x = NULL, y = NULL) + theme_minimal(base_size = 12) + theme( plot.title = element_text(face = "bold"), panel.grid.minor = element_blank() ) }
步骤3:生成所有产品的图表并拼接
用patchwork的语法快速组合布局,还能统一添加总标题:
# 生成每个产品的单独图表 plot_a <- create_single_plot("Produto A") plot_b <- create_single_plot("Produto B") plot_c <- create_single_plot("Produto C") plot_d <- create_single_plot("Produto D") plot_e <- create_single_plot("Produto E") # 拼接成和facet_wrap一致的布局(2行:第一行2个,第二行3个) (plot_a + plot_b) / (plot_c + plot_d + plot_e) + plot_annotation( title = "Preço Médio do Produto no Varejo por Ano", theme = theme(plot.title = element_text(size = 14, face = "bold")) )
这个方案完全避开了facet_wrap(),最终效果和你用分面生成的图表几乎一致,同时保留了每个面板x轴自由缩放的特性。
内容的提问来源于stack exchange,提问作者Laura
相关产品推荐
相关产品推荐

