如何在ggcorrplot生成的相关矩阵中正确设置上下标标签?
如何在ggcorrplot中正确显示带上下标的标签(不使用Unicode)
问题描述
尝试用ggcorrplot包自定义相关矩阵的标签,但上下标格式无法正常显示,希望在不使用Unicode字符的前提下解决这个问题。
尝试1:格式显示异常
library(tidyverse) library(ggcorrplot) # 示例数据 M <- cor(mtcars)[1:3,1:3] # 设置列名与行名 colnames(M) <- c("Temperature\n (^o C)", "PO[4]^2", "Oxygen\n (mg L^-1)") rownames(M) <- c("Temperature\n (^o C)", "PO[4]^2", "Oxygen\n (mg L^-1)") ggcorrplot(M, type = "lower", lab = TRUE, ggtheme = theme_bw())

尝试2:代码报错
ggcorrplot(M, type = "lower", lab = TRUE, scale_x_discrete(labels = c("mpg" = expression(Temperature~(degree*C)), "cyl" = expression(PO[4]^2), "disp" = expression(Oxygen~(mg~L^-1)))), scale_y_discrete(labels = c("mpg" = expression(Temperature~(degree*C)), "cyl" = expression(PO[4]^2), "disp" = expression(Oxygen~(mg~L^-1)))), ggtheme = theme_bw())
错误于match.arg(method): 'arg'必须为NULL或字符向量
解决方案
ggcorrplot本身不支持直接传入expression类型的标签,但可以通过先绘制基础图、再手动替换坐标轴标签的方式解决:
步骤1:绘制基础相关矩阵图
先保留矩阵的原始列名/行名,正常生成ggcorrplot对象:
library(tidyverse) library(ggcorrplot) M <- cor(mtcars)[1:3,1:3] # 用原始列名/行名便于后续匹配 colnames(M) <- c("mpg", "cyl", "disp") rownames(M) <- c("mpg", "cyl", "disp") p <- ggcorrplot(M, type = "lower", lab = TRUE, ggtheme = theme_bw())
步骤2:解析表达式替换标签
利用ggplot2的图层扩展功能,通过scale_x_discrete和scale_y_discrete设置标签,并开启parse = TRUE让系统解析表达式格式:
p + scale_x_discrete(labels = c( "mpg" = "Temperature~(degree*C)", "cyl" = "PO[4]^2", "disp" = "Oxygen~(mg~L^-1)" ), parse = TRUE) + scale_y_discrete(labels = c( "mpg" = "Temperature~(degree*C)", "cyl" = "PO[4]^2", "disp" = "Oxygen~(mg~L^-1)" ), parse = TRUE)
也可以直接传入expression对象:
p + scale_x_discrete(labels = expression( Temperature~(degree*C), PO[4]^2, Oxygen~(mg~L^-1) ), parse = TRUE) + scale_y_discrete(labels = expression( Temperature~(degree*C), PO[4]^2, Oxygen~(mg~L^-1) ), parse = TRUE)
核心原理
- ggcorrplot返回的是标准ggplot对象,因此可以叠加ggplot2的图层修改元素
parse = TRUE会让ggplot将字符串或expression对象解析为绘图专用表达式,支持上下标、特殊符号(如degree对应摄氏度符号)- 避免直接在矩阵列名/行名中写入格式标记,通过坐标轴标签解析实现正确渲染
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

