You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将两个不同数据框的分面ggplot按日期X轴叠加

解决不同数据框的ggplot分面合并问题

要合并两个来自不同数据框的分面ggplot图表,核心是避免全局数据框绑定,让每个图层独立指定数据源和映射,同时确保X轴格式统一。以下是具体解决方案:

关键问题分析

你之前报错的原因是:当在ggplot()中指定全局数据框后,后续图层若使用其他数据框,未明确指定data=参数会导致ggplot默认从全局数据框找变量,而目标变量只存在于特定数据框中。此外,两个图表的X轴计算方式不一致(一个是date(DATETIME),一个是按周floor的日期),会导致轴不对齐。

基础合并方案(单Y轴)

先统一两个图表的X轴为按周聚合的日期,然后每个图层单独指定数据和映射:

library(ggplot2)
library(lubridate)

ggplot() +
  # 添加第一个图表的线和点图层
  geom_line(data = averaged_activity, 
            aes(x = floor_date(date(DATETIME), unit = "week"), 
                y = PERCENTAGE, 
                group = POPULATION),
            stat = "summary", fun = "mean") +
  geom_point(data = averaged_activity, 
             aes(x = floor_date(date(DATETIME), unit = "week"), 
                 y = PERCENTAGE, 
                 group = POPULATION),
             stat = "summary", fun = "mean") +
  # 添加第二个图表的直方图图层
  geom_histogram(data = info_table, 
                 aes(x = floor_date(DATE_OF_METAMORPHOSIS, unit = "week"), 
                     group = POPULATION),
                 binwidth = 7) +  # 按周分箱,binwidth设为7天
  # 轴标签与格式设置
  labs(y = "Activity (%) / 变态数量", x = "日期") +
  scale_x_date(date_labels = "%d/%m/%y", date_breaks = "1 week") +
  # 共用分面
  facet_wrap(~POPULATION, ncol = 1)

优化方案(双Y轴适配不同指标)

如果两个图表的Y轴含义不同(一个是百分比,一个是计数),可以用双Y轴区分:

步骤1:先汇总直方图的每周计数

library(dplyr)

# 提前统计info_table中每周的变态数量
info_table_weekly <- info_table %>%
  mutate(week_date = floor_date(DATE_OF_METAMORPHOSIS, unit = "week")) %>%
  count(POPULATION, week_date, name = "metamorphosis_count")

步骤2:构建双Y轴图表

# 计算Y轴刻度转换比例
max_activity <- max(averaged_activity$PERCENTAGE, na.rm = TRUE)
max_metamorphosis <- max(info_table_weekly$metamorphosis_count, na.rm = TRUE)
scale_ratio <- max_activity / max_metamorphosis

ggplot() +
  # 活动百分比的线和点(左Y轴)
  geom_line(data = averaged_activity, 
            aes(x = floor_date(date(DATETIME), unit = "week"), 
                y = PERCENTAGE, 
                group = POPULATION),
            stat = "summary", fun = "mean", color = "#2E86AB") +
  geom_point(data = averaged_activity, 
             aes(x = floor_date(date(DATETIME), unit = "week"), 
                 y = PERCENTAGE, 
                 group = POPULATION),
             stat = "summary", fun = "mean", color = "#2E86AB") +
  # 变态数量的柱状图(右Y轴,转换刻度)
  geom_col(data = info_table_weekly, 
           aes(x = week_date, 
               y = metamorphosis_count * scale_ratio,
               group = POPULATION),
           fill = "#F24C4E", alpha = 0.3) +
  # 设置双Y轴
  scale_y_continuous(
    name = "活动百分比 (%)",
    sec.axis = sec_axis(~ . / scale_ratio, name = "变态数量")
  ) +
  scale_x_date(date_labels = "%d/%m/%y", date_breaks = "1 week") +
  facet_wrap(~POPULATION, ncol = 1) +
  # 美化双Y轴颜色区分
  theme(
    axis.text.y.left = element_text(color = "#2E86AB"),
    axis.title.y.left = element_text(color = "#2E86AB"),
    axis.text.y.right = element_text(color = "#F24C4E"),
    axis.title.y.right = element_text(color = "#F24C4E")
  )

注意事项

  • 每个图层必须明确指定data=参数,确保ggplot从正确的数据框读取变量
  • 统一X轴的日期计算方式,保证两个图层的轴刻度完全对齐
  • 直方图需要指定binwidth(按周分箱设为7天),避免自动分箱出现异常
  • 双Y轴的刻度转换比例需要根据实际数据计算,确保两个指标的显示比例协调

内容的提问来源于stack exchange,提问作者Maya Eldar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:16:20