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

如何循环绘制两个结构相同的DataFrame列对比散点图?

没问题!我来给你一步步拆解怎么实现这个需求,不管是用R的基础绘图工具还是ggplot2都能搞定,而且两种思路都不需要提前合并数据(当然合并后也能做,我也会给你演示)。

方法一:基础绘图 + lapply(无需合并数据)

这种方法直接遍历列名,每次取出两个DataFrame的对应列绘图,非常直观:

# 先定义你的数据框
df1 <- data.frame(HV = c(3,3,3), NAtlantic850t = c(0.501, 1.373, 1.88), AO = c(-0.0512, 0.2892, 0.0664))
df2 <- data.frame(HV = c(3,3,2), NAtlantic850t = c(1.2384, 1.3637, -0.0332), AO = c(-0.5915, -0.0596, -0.8842))

# 用基础plot + lapply批量绘制散点图
lapply(colnames(df1), function(col) {
  # 取出当前列的两组数据
  x_data <- df1[[col]]
  y_data <- df2[[col]]
  
  # 绘制散点图
  plot(x = x_data, y = y_data,
       main = paste("散点图:", col, "(df1 vs df2)"),
       xlab = paste("df1$", col, sep = ""),
       ylab = paste("df2$", col, sep = ""),
       pch = 16, col = "steelblue")
  
  # 添加y=x参考线,方便对比数值差异
  abline(a = 0, b = 1, lty = 2, col = "red")
})

这里用[[col]]而非$来取列,是因为$无法识别循环中的变量名,而[[ ]]更适合动态取列。

方法二:ggplot2 + lapply(无需合并数据)

如果你习惯用ggplot2绘图,同样可以用lapply循环实现,每次循环临时构造一个小数据框来适配ggplot的语法:

library(ggplot2)

lapply(colnames(df1), function(col) {
  # 临时构造包含当前列两组数据的小数据框
  temp_df <- data.frame(
    df1_val = df1[[col]],
    df2_val = df2[[col]]
  )
  
  # 用ggplot绘制散点图
  ggplot(temp_df, aes(x = df1_val, y = df2_val)) +
    geom_point(color = "steelblue", size = 3) +
    geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
    labs(title = paste("散点图:", col, "(df1 vs df2)"),
         x = paste("df1$", col, sep = ""),
         y = paste("df2$", col, sep = "")) +
    theme_minimal()
})
方法三:合并数据后用ggplot2分面(一次性输出所有图)

如果你希望一次性看到所有对比图,也可以先把数据整理成长格式,再用分面功能批量绘制:

library(ggplot2)
library(dplyr)
library(tidyr)

# 把两个数据框转成长格式并标记来源
df1_long <- df1 %>%
  mutate(source = "df1") %>%
  pivot_longer(cols = -source, names_to = "variable", values_to = "value")

df2_long <- df2 %>%
  mutate(source = "df2") %>%
  pivot_longer(cols = -source, names_to = "variable", values_to = "value")

# 合并后转成宽格式,方便对比
combined_df <- full_join(df1_long, df2_long, by = "variable") %>%
  rename(df1_val = value.x, df2_val = value.y) %>%
  select(-source.x, -source.y)

# 用分面一次性绘制所有子图
ggplot(combined_df, aes(x = df1_val, y = df2_val)) +
  geom_point(color = "steelblue", size = 3) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
  labs(title = "df1 vs df2 各变量散点图对比",
       x = "df1 数值",
       y = "df2 数值") +
  facet_wrap(~variable, scales = "free") + # 每个子图用自由刻度,适配不同变量的数值范围
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:42:38