如何在pairs2绘图上叠加显示第二个数据框的点集?
在pairs2绘图中叠加第二组点的实现方案
问题背景
需要在pairs2生成的变量两两对比图上,叠加显示来自另一数据框的预定义中心点(该数据框行数远小于主数据框,且每个子图对应的两组变量需匹配对应中心点)。此前用pairs结合kmeans实现过类似效果,但切换到pairs2后,尝试rbind方法报错(提示多余逗号),无法正常叠加。
主数据与中心点数据示例:
df1 <- data.frame( TM = c(25.1889,24.1304,24.0604,23.9402,23.7745,23.6654,23.6645,22.8439,21.3716,21.4657,21.2049,17.3545,17.7282,17.4494,12.2787,12.2857,13.1354,8.2202,8.2664,8.6777,6.2524,6.213,6.2178,5.836,5.6775,5.1592,5.0871,5.169,4.1378,4.1378,4.1187,3.2187,3.2187,3.2308,2.568), SAM = c(36.1452,35.8868,35.8872,35.874,35.9173,35.9898,36.0154,36.053,35.8427,35.8532,35.829,35.3498,35.4001,35.3643,34.7479,34.7496,34.8415,34.4096,34.4138,34.4416,34.3268,34.3289,34.329,34.3271,34.3303,34.3649,34.3747,34.3936,34.4629,34.4629,34.4649,34.527,34.527,34.5264,34.5909), OY = c(206.2866,212.5171,207.3589,205.7436,202.1023,192.1531,190.6164,179.7472,178.2853,176.2884,176.5031,187.4516,183.8077,184.0845,183.0525,179.0316,179.9783,189.5713,185.268,181.5232,206.1538,201.0054,200.9562,200.0553,193.3422,174.8636,169.43,161.9325,149.089,149.089,150.2571,148.2609,148.2609,149.8462,145.8923), SIL = c(0.478441942,0.576011972,0.380745706,0.380736114,0.575939073,0.478281445,0.478272244,0.47814645,1.141410862,0.575593193,0.575563169,1.335656023,1.043229301,1.14068256,4.667007731,4.569575097,3.71251671,1.042085277,9.320365185,8.950634348,13.98250042,14.65426647,14.37189781,17.69141471,20.07645471,31.58209857,33.00297051,35.30033062,57.66252594,57.08823677,57.74992561,78.87097909,78.57900854,78.75430906,99.11314727), stringsAsFactors = FALSE) df2 <- data.frame( params = c("AA","BB","CC","DD","EE","FF"), Ct = c(4.51,2.2,4.67,1.1,0.89,7.3), Sa = c(34.25,34.57,34.67,34.73,34.7,34.6), Ph = c(1.2,2.09,3.3,2.76,1.89,1.1), stringsAsFactors = FALSE)
当前基础绘图代码:
pairs2(df1[1], df1[c(2,3,4)])
解决方案
pairs2(来自TeachingDemos包)支持通过panel参数自定义子图的绘制逻辑,我们可以利用这一点实现两组点的叠加:
1. 对齐变量名
先将df2的变量名与df1对应(根据实际变量映射关系调整):
# 调整df2变量名,与df1的变量匹配 colnames(df2)[2:4] <- c("TM", "SAM", "OY")
2. 自定义绘图面板函数
编写面板函数,先绘制主数据df1的点,再根据当前子图的变量对,取出df2中对应的中心点叠加绘制:
library(TeachingDemos) custom_panel <- function(x, y, ...) { # 绘制主数据点 points(x, y, col = "black", pch = 16, ...) # 获取当前子图的x、y变量名 x_var <- deparse(substitute(x)) y_var <- deparse(substitute(y)) # 检查df2是否包含对应变量,避免报错 if (x_var %in% colnames(df2) && y_var %in% colnames(df2)) { # 叠加绘制中心点,用不同颜色和形状区分 points(df2[[x_var]], df2[[y_var]], col = "red", pch = 17, cex = 1.2, ...) } }
3. 调用pairs2绘制叠加图
使用自定义面板函数生成带中心点的两两对比图:
# 绘制df1第一列与后三列的对比图,并叠加df2的中心点 pairs2(df1[1], df1[c(2,3,4)], panel = custom_panel) # 如果需要绘制df1所有变量的两两对比,直接传入df1即可 # pairs2(df1, panel = custom_panel)
错误说明
之前遇到的"多余逗号"错误,是因为pairs2的参数格式与pairs存在差异,直接用rbind合并数据的方式不适用。通过自定义panel函数的方式,绕开了数据合并的问题,直接在每个子图中分别绘制两组数据,能有效避免这类格式错误。
内容的提问来源于stack exchange,提问作者ASchnur
相关产品推荐
相关产品推荐

