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

如何在R的ggplot2中绘制含x与y双参数的TAS函数曲线?

解决ggplot2绘制TAS曲线的问题

geom_function()仅支持单参数函数(默认以x为输入),无法直接传入x和y两个参数。解决方法是将TAS公式变形为y关于x的表达式,具体步骤如下:

公式变形

已知TAS = sqrt(x*y/978),假设要绘制TAS为固定值k的曲线,对公式变形:

  1. 两边平方得:TAS² = x*y/978
  2. 整理为y关于x的函数:y = (978 * TAS²)/x

示例代码

绘制单条TAS曲线

library(ggplot2)

# 加载数据(以你提供的样本为例)
df <- data.frame(
  cc_q75 = c(0.27, 0.31, 0.57, 0.48, 0.63, 0.21, 0.28, 0.48, 0.59, 0.42, 0.34, 0.27, 0.71, 0.29, 0.57, 0.72, 0.57, 0.59, 0.40, 0.37),
  ss_ngene = c(167, 158, 310, 172, 220, 135, 136, 276, 319, 251, 162, 95, 429, 104, 409, 537, 429, 400, 235, 146)
)

# 设定目标TAS值
target_tas <- 5

ggplot(df, aes(x = cc_q75, y = ss_ngene)) + 
  geom_point() + 
  # 使用变形后的公式绘制TAS曲线,通过args传递目标TAS值
  geom_function(fun = function(x, tas) (978 * tas^2)/x, 
                args = list(tas = target_tas),
                color = "red", linetype = "dashed") + 
  geom_hline(yintercept = 200) + 
  geom_vline(xintercept = 0.2)+ 
  theme_minimal()

绘制多条不同TAS值的曲线

如果需要同时展示多个TAS值的曲线,可以批量生成图层:

library(ggplot2)
library(scales)

# 定义多个TAS值
tas_values <- c(3, 5, 7)

ggplot(df, aes(x = cc_q75, y = ss_ngene)) + 
  geom_point() + 
  # 循环添加每条TAS曲线
  lapply(tas_values, function(k) {
    geom_function(fun = function(x) (978 * k^2)/x, 
                  color = hue_pal()(length(tas_values))[which(tas_values == k)],
                  linetype = "dashed")
  }) +
  # 添加曲线标签(可选)
  annotate("text", x = 0.6, y = sapply(tas_values, function(k) (978*k^2)/0.6),
           label = paste("TAS =", tas_values), color = hue_pal()(length(tas_values))) +
  geom_hline(yintercept = 200) + 
  geom_vline(xintercept = 0.2)+ 
  theme_minimal() +
  labs(title = "TAS等高线")

关键说明

  • geom_function()的核心逻辑是基于x轴的取值范围,计算对应的y值,因此必须提供单参数函数(输入为x)。
  • 若需要绘制动态的TAS曲线(而非固定值),你需要先根据数据计算每个点的TAS值,再用geom_line()或geom_path()连接,但通常TAS作为指标,更多是绘制固定值的等高线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:32:37