如何在ggplot2方程中同时使用Times New Roman字体和斜体格式?
问题描述
需要让ggplot生成的图表中所有文本采用Times New Roman字体,同时将stat_poly_eq生成的R²、P值中的变量(R、P)设置为斜体格式。但设置字体后,斜体样式被自动覆盖,尝试手动拼接italic表达式、使用expression()函数等方法均未生效,且未在ggpmisc或stat_poly_eq的文档中找到相关字体样式说明。使用的包包括ggplot2、ggpmisc和showtext。
解决方案
核心问题在于showtext配合parse=TRUE解析数学表达式时,若仅加载常规字体,无法识别斜体样式。需同时加载Times New Roman的斜体变体,并手动构建包含斜体标记的表达式字符串。
关键步骤
- 同时加载Times New Roman的常规字体和斜体字体,确保
italic()能调用对应样式 - 手动构建表达式字符串,用
italic(R)和italic(P)包裹需要斜体的变量,配合parse=TRUE解析 - 通过theme的
base_family统一设置所有文本的字体族,无需在stat_poly_eq中单独指定
修改后的完整代码
library(ggplot2) library(ggpmisc) library(showtext) # 加载Times New Roman常规及斜体字体 font_add(family = "Times New Roman", regular = "C:/Windows/Fonts/times.ttf", italic = "C:/Windows/Fonts/timesi.ttf") showtext_auto() # 数据集 df <- structure(list( MaxRot = c(2520, 1800, 1800, 1260), Height = c(44.1, 61.7, 57.1, 26.5) ), class = "data.frame", row.names = c(NA, 4)) # 绘制图表 ggplot(df, aes(x = MaxRot, y = Height)) + geom_point(size = 3) + # 添加散点便于观察趋势 stat_poly_eq( formula = y ~ x, aes(label = paste("italic(R)^2 == ", signif(..rr.., 2), sep = "")), parse = TRUE, size = 6 ) + stat_poly_eq( formula = y ~ x, aes(label = paste("italic(P) == ", signif(..p.value.., 3), sep = "")), parse = TRUE, size = 6, vjust = 3 ) + scale_x_continuous( name = "Maximum rotation (°)", limits = c(0, 2600), breaks = seq(0, 2600, by = 200), expand = c(0, 0) ) + scale_y_continuous( name = "Length (mm)", limits = c(0, 70), breaks = seq(0, 70, by = 10), expand = c(0, 0) ) + theme_minimal(base_family = "Times New Roman")
说明
signif()函数用于控制数值精度,可根据需求调整小数位数- 若系统中Times New Roman的字体路径不同,需修改
font_add中的文件路径 - 手动构建表达式替代
..rr.label..和..p.value.label..,能更精准控制斜体范围与字体样式
内容的提问来源于stack exchange,提问作者Mariah Howell
相关产品推荐
相关产品推荐

