如何在R中修改grid::grob对象:调整eulerr图文本与添加标签
解决方案
1. 将p1中的数值转换为百分比格式
eulerr生成的grob对象里,数量文本存放在text类型的子元素中,我们可以直接遍历修改这些文本,把浮点数转为百分比格式:
library(eulerr) library(grid) # 生成原始p1 p1 <- euler(c("A" = 0.205, "B" = 0.137, "A&B" = 0.0513)) |> plot(quantities = TRUE, fills = list(fill = c("lavenderblush2", "lightblue2", "lightsalmon"))) # 修改数值为百分比格式 for (i in seq_along(p1$children)) { if (inherits(p1$children[[i]], "text")) { num <- as.numeric(p1$children[[i]]$label) if (!is.na(num)) { # 保留1位小数,可根据需求调整为%.2f%%保留两位 p1$children[[i]]$label <- sprintf("%.1f%%", num * 100) } } } # 绘制修改后的p1 grid.draw(p1)
2. 给p2添加自定义标签
基于grid包,有两种方式可以实现:
方式1:绘制后直接添加标签
# 生成原始p2 p2 <- euler(c("A" = 0.205, "B" = 0.137, "A&B" = 0.0513)) |> plot(quantities = FALSE, fills = list(fill = c("#9195F6", "#9195F6", "#9195F6"))) # 新建绘图页并绘制p2 grid.newpage() grid.draw(p2) # 添加自定义标签,x/y为0-1的相对坐标,可根据图表调整 grid.text("仅A", x = 0.35, y = 0.5, gp = gpar(fontsize = 12)) grid.text("仅B", x = 0.65, y = 0.5, gp = gpar(fontsize = 12)) grid.text("A∩B", x = 0.5, y = 0.5, gp = gpar(fontsize = 12, fontface = "bold"))
方式2:将标签整合为一个grob对象
如果需要把标签和p2合并成一个整体grob,方便后续复用:
# 创建标签grob集合 labels <- gList( textGrob("仅A", x = 0.35, y = 0.5, gp = gpar(fontsize = 12)), textGrob("仅B", x = 0.65, y = 0.5, gp = gpar(fontsize = 12)), textGrob("A∩B", x = 0.5, y = 0.5, gp = gpar(fontsize = 12, fontface = "bold")) ) # 合并p2与标签 p2_with_labels <- gTree(children = gList(p2, labels)) # 绘制合并后的grob grid.draw(p2_with_labels)
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

