R语言中如何让两个并排的corrplot尺寸一致并添加变量映射图例?
问题:corrplot并排绘制时尺寸不一致的优化方案
问题背景
现有两个数据框df1和df2,生成Pearson相关矩阵后,因变量名称过长,通过自定义函数将其映射为短名称。使用par(mfrow=c(1,2))并排绘制corrplot时,保留长行名的第一个图尺寸小于第二个图。已尝试用layout()手动设置宽度,但希望找到无需手动调整的方法让两图尺寸一致,或在图外添加短名称与原变量名的映射图例。
原始代码示例
v1 <- rnorm(100, 0, 1) df1 <- data.frame("Very_long_variable_name_1" = v1, "Very_long_variable_name_2" = v1 + rnorm(100, 0, 0.1)) df2 <- data.frame("Very_long_variable_name_1" = 3*v1 - 1, "Very_long_variable_name_2" = 2*v1 + rnorm(100, 0, 0.1)) cors1 <- cor(df1, method = "pearson") cors2 <- cor(df2, method = "pearson") fun <- function(corr, shortName) { if(shortName) { rownames(corr) <- c("V1", "V2") } colnames(corr) <- c("V1", "V2") return(corr) } par(mfrow = c(1,2)) cp1 <- corrplot::corrplot(fun(cors1, FALSE), method = "color") cp2 <- corrplot::corrplot(fun(cors2, TRUE), method = "color")
已尝试的手动调整方案
layout(matrix(c(1, 2), nrow = 1, ncol = 2, byrow = TRUE), widths = c(1.5,1)) cp1 <- corrplot::corrplot(fun(cors1, FALSE), method = "color") cp2 <- corrplot::corrplot(fun(cors2, TRUE), method = "color")
优化方案
方案1:统一使用短名称,添加外部映射图例
让两个图都使用短变量名,确保尺寸完全一致,再在绘图区域外添加短名称与原变量名的映射说明,既解决尺寸问题又保留变量名信息。
# 定义短名称与原变量名的映射表 name_mapping <- c( "V1" = "Very_long_variable_name_1", "V2" = "Very_long_variable_name_2" ) # 统一将两个相关矩阵转换为短名称格式 cors1_short <- fun(cors1, TRUE) cors2_short <- fun(cors2, TRUE) # 绘制并排的corrplot par(mfrow = c(1, 2)) corrplot::corrplot(cors1_short, method = "color", main = "df1 相关矩阵") corrplot::corrplot(cors2_short, method = "color", main = "df2 相关矩阵") # 在整个绘图区域下方添加映射图例 par(fig = c(0, 1, 0, 0.1), new = TRUE) # 新建绘图区域,占底部10%高度 plot(0, 0, type = "n", bty = "n", xaxt = "n", yaxt = "n") # 空画布 legend( "center", legend = paste(names(name_mapping), "=", name_mapping), bty = "n", # 去掉图例边框 ncol = 2, # 两列展示 cex = 0.8 # 调整文本大小 )
方案2:自动计算宽度比例,无需手动调整
通过计算长名称和短名称的实际宽度比例,用layout()自动分配绘图宽度,避免手动设置固定数值。
# 获取长名称和短名称的文本宽度(单位:英寸) long_names <- rownames(cors1) short_names <- c("V1", "V2") long_width <- max(strwidth(long_names, units = "inches")) short_width <- max(strwidth(short_names, units = "inches")) # 计算宽度比例,自动设置layout宽度 width_ratio <- long_width / short_width layout(matrix(c(1, 2), nrow = 1), widths = c(width_ratio, 1)) # 绘制两个corrplot corrplot::corrplot(fun(cors1, FALSE), method = "color") corrplot::corrplot(fun(cors2, TRUE), method = "color")
内容的提问来源于stack exchange,提问作者thesecond
相关产品推荐
相关产品推荐

