如何在R的faceted ggplot空白分面中添加文本框?
在ggplot分面的空白区域添加文本框的实现方法
针对你遇到的5个数值变量分面后出现空白区域的问题,有两种实用的解决方法:
方法一:给数据集添加空分组,指定分面文本
这种方法通过构造包含空分组的数据集,让空白分面有对应的分组标识,再针对性添加文本:
步骤与代码
- 先模拟/处理数据集(这里模拟
work数据集方便演示):
set.seed(123) work <- data.frame( var1 = rnorm(100), var2 = rnorm(100, mean=5), var3 = rnorm(100, sd=2), var4 = rnorm(100, mean=2, sd=3), var5 = rnorm(100, mean=10) ) library(tidyverse) # 整理数据并添加空分组 plot_data <- work %>% keep(is.numeric) %>% gather(key = "key", value = "value") %>% # 新增一个空分组,value设为NA避免绘制密度曲线 add_row(key = "说明", value = NA)
- 绘制分面图并添加文本:
ggplot(plot_data, aes(x = value)) + geom_density() + # 指定分面行列数,确保5个变量+1个空分组填满网格 facet_wrap(~key, scales = "free", nrow = 2, ncol = 3) + # 仅在空分组的分面添加文本 annotate("text", x = 0, y = 0, label = "这是空白区域\n可自定义文本内容", color = "darkred", size = 4) + theme(strip.text = element_text(size = 10))
方法二:用patchwork拼接文本图
如果不想修改原数据集,用patchwork包拼接分面图和纯文本图更灵活:
步骤与代码
library(patchwork) # 绘制原分面图,指定行列数预留空白位置 p1 <- work %>% keep(is.numeric) %>% gather() %>% ggplot(aes(x = value)) + geom_density() + facet_wrap(~key, scales = "free", nrow = 2, ncol = 3) + theme(strip.text = element_text(size = 10)) # 绘制纯文本图,隐藏坐标轴和背景 p_text <- ggplot() + annotate("text", x = 1, y = 1, label = "自定义提示文本", color = "blue", size = 4) + theme_void() # 拼接两个图,文本图自动填充空白位置 p1 + p_text + plot_layout(nrow = 2, ncol = 3, guides = "collect")
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

