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

如何在ggplot中叠加含不同X/Y轴的两类图表?

解决方案:使用双X轴实现离散与连续刻度共存

要实现离散点(X轴为分类变量)和连续函数曲线(X轴为0-20的连续值)在同一分面图表中叠加,可通过将分类变量映射为数值并添加双X轴的方式实现,具体代码如下:

library(tidyverse)

df <- data.frame(x=c("borrowing", "ignorant", "borrowing", "ignorant"), 
                 y=c(0.9, 0.5, 0.2, 0.8), 
                 z=c("same", "same", "diff", "diff"))
myfun <- function(a,b,x){a + x*b}

# 将离散x转换为数值(1对应borrowing,2对应ignorant),用于对齐双轴
df$x_num <- as.numeric(factor(df$x))

ggplot() +
  # 绘制离散点,基于数值化的x映射
  geom_point(data=df, aes(x=x_num, y=y)) +
  # 绘制函数曲线,限制x范围为0-20,调整b值让y值和点的范围匹配
  geom_function(data = data.frame(z="diff"), fun=myfun, args=list(a=0, b=0.04), xlim=c(0,20)) +
  geom_function(data = data.frame(z="same"), fun=myfun, args=list(a=0, b=0.02), xlim=c(0,20)) +
  # 底部X轴:显示分类标签,对应数值1和2
  scale_x_continuous(
    name = "分类X轴",
    breaks = c(1,2),
    labels = c("borrowing", "ignorant"),
    limits = c(0,20)
  ) +
  # 顶部X轴:显示0-20的连续刻度
  scale_x_continuous(
    name = "连续X轴",
    breaks = seq(0,20,5),
    limits = c(0,20),
    sec.axis = dup_axis(name = "")
  ) +
  facet_grid(~z) +
  theme(
    axis.text.top = element_text(angle=45, vjust=0.5),
    axis.title.top = element_text(margin=margin(b=10))
  )

核心细节:

  • 先把离散分类变量转成数值,让点和函数曲线共用同一数值轴基础,再通过刻度标签分别还原分类和连续刻度。
  • 调整geom_function的b参数,让函数曲线的y值范围和离散点的y值(0.2-0.9)匹配,避免曲线超出可视范围。
  • 利用sec.axis创建双X轴,底部展示分类标签,顶部展示连续刻度,实现两类图表的叠加对齐。

替代方案:用patchwork组合独立图表

如果希望两类图表完全保留各自独立的刻度(非叠加),可以用patchwork包将每个分面的点图和函数图横向组合,代码如下:

library(tidyverse)
library(patchwork)

df <- data.frame(x=c("borrowing", "ignorant", "borrowing", "ignorant"), 
                 y=c(0.9, 0.5, 0.2, 0.8), 
                 z=c("same", "same", "diff", "diff"))
myfun <- function(a,b,x){a + x*b}

# 批量生成点图的函数
plot_points <- function(z_val) {
  df %>% 
    filter(z == z_val) %>% 
    ggplot(aes(x=x, y=y)) +
    geom_point() +
    labs(x="分类X轴", y="Y值") +
    ggtitle(z_val)
}

# 批量生成函数曲线图的函数
plot_func <- function(z_val, b_val) {
  ggplot(data.frame(x=0:20), aes(x=x)) +
    geom_function(fun=myfun, args=list(a=0, b=b_val)) +
    labs(x="连续X轴(0-20)", y="函数值") +
    xlim(0,20)
}

# 组合对应分面的图表
plot_points("same") + plot_func("same", 1) +
  plot_points("diff") + plot_func("diff", 2) +
  plot_layout(ncol=2, guides="collect")

核心细节:

  • 通过自定义函数批量生成对应分面的点图和函数图,简化代码逻辑。
  • 用patchwork的布局功能,将同一分面的两类图表横向排列,各自保留独立的轴刻度,同时保持整体视觉统一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:16:18