如何用ggplot的facet_grid将三个时间序列绘制成两个分面?
实现两个分面的时间序列展示
要把两只股票放在同一个分面、指标单独一个分面,核心是给数据新增一个分组列,将stock1和stock2归为同一组,indicator单独一组,再用这个分组列作为分面依据。
步骤1:处理数据,新增分面分组列
先将数据宽转长,再通过case_when创建分面分组列facet_group:
library(tidyverse) # 你的原始数据 stock1 = cumprod(1+c(0, rnorm(99, 0, .05))) stock2 = cumprod(1+c(0, rnorm(99, 0, .075))) indicator = sample(1:50, 100, replace = TRUE) date_seq = seq.Date(as.Date("2023-01-01"), length.out = 100, by = 1) df = data.frame(date = date_seq, stock1 = stock1, stock2 = stock2, indicator = indicator) # 宽转长并新增分面分组列 grid_df = pivot_longer(df, c(stock1, stock2, indicator), names_to = "underlying", values_to = "values") %>% mutate(facet_group = case_when( underlying %in% c("stock1", "stock2") ~ "Stocks", TRUE ~ "Indicator" ))
步骤2:用facet_grid绘制双分面图表
用facet_group作为分面变量,同时保留underlying来区分线条颜色:
ggplot(grid_df, aes(x = date, y = values, colour = underlying)) + geom_line(linewidth = 1) + facet_grid(vars(facet_group), scales = "free_y") + # 仅y轴自由缩放,x轴保持对齐更直观 labs(colour = "Series") + theme_minimal()
关键说明
- 原代码用
underlying(三个唯一值)做分面,所以生成三个分面;新增分组列后,只有两个唯一值,对应两个分面。 - 设置
scales = "free_y"比"free"更合理,因为x轴都是日期,保持对齐能更直观对比时间维度的变化。
内容的提问来源于stack exchange,提问作者Matthias Bernhardt
相关产品推荐
相关产品推荐

