如何循环绘制两个结构相同的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
相关产品推荐
相关产品推荐

