如何修改EnhancedVolcano包绘制火山图的全部文本字体?
EnhancedVolcano火山图基因标签字体修改方案
问题原因
EnhancedVolcano 输出的是ggplot2对象,但基因名称标签是包内部独立调用geom_text/geom_text_repel(开启drawConnectors=TRUE时使用)绘制的,不属于ggplot全局theme的文本控制范围,因此theme(text = element_text())的设置只会作用于坐标轴、标题这类由theme管控的文本,无法覆盖基因标签。
解决方法
方法1:绘图时直接指定标签字体(推荐)
EnhancedVolcano 原生提供了labFamily参数专门控制基因标签的字体,直接在函数调用时传入目标字体即可,一次设置不需要后续修改图层。
修改后的绘图核心代码如下:
a <- EnhancedVolcano(data.matrix, lab = rownames(data.matrix), x = "Log2.fold.change", y = "P.value", xlim = c(-2, 2), ylim = c(0, 6), xlab = bquote(~ Log[2] ~ "fold change"), ylab = bquote(~ -Log[10] ~ italic(P)), axisLabSize = 12, title = paste("NanoString -", data.name), subtitle = "", labFace = "bold", labFamily = "Arial", # 新增该行指定标签字体为Arial pointSize = 2, labSize = 5, pCutoff = 10e-2, FCcutoff = 0.4, gridlines.major = FALSE, gridlines.minor = FALSE, drawConnectors = TRUE, widthConnectors = 0.2, colConnectors = "black", legendPosition = "none" ) # 全局主题设置统一其余文本的字体、字号 EV_merge <- a + theme(text = element_text(size = 8, family = "Arial")) print(EV_merge)
方法2:修改已有ggplot对象的图层参数
如果不想重新运行绘图代码,可以直接遍历图对象的图层,定位到基因标签对应的文本图层,直接修改其字体参数:
EV_merge <- a + theme(text = element_text(size = 8, family = "Arial")) # 遍历所有图层,替换文本类图层的字体为Arial for (layer_idx in seq_along(EV_merge$layers)) { current_geom <- EV_merge$layers[[layer_idx]]$geom # 匹配普通文本层、带连接线的ggrepel文本层 if (inherits(current_geom, "GeomText") | inherits(current_geom, "GeomTextRepel")) { EV_merge$layers[[layer_idx]]$aes_params$family <- "Arial" } } print(EV_merge)
注意事项
- 不建议用
sans作为字体名别名,不同操作系统下sans映射的默认无衬线字体可能有差异,直接指定"Arial"可以保证跨环境字体一致。 - 原代码中设置的
labFace = "bold"参数和labFamily参数完全兼容,不会出现加粗效果失效的问题。
内容的提问来源于stack exchange,提问作者Jun Li
相关产品推荐
相关产品推荐

