R语言 从ggplot获取图例标签(文本)

lf5gs5x2  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图从ggplot图例对象中提取标签文本,例如:对于该图:

library(ggplot2)
(p <- ggplot(mtcars, aes(x=mpg, y=disp, color=as.character(cyl))) + geom_point())

我可以通过以下方式提取图例

library(ggpubr)
legend <- ggpubr::get_legend(p)

接下来,我想得到图例对象中包含的实际字符串值,即对于这种情况**“4”,“6”,“8”**。如何从图例对象中检索这些值?

  • 注意:我没有原始数据,只有图例对象。*
wixjitnu

wixjitnu1#

首先设置图例:

library(ggplot2)
library(ggpubr)

p <- ggplot(mtcars, aes(x=mpg, y=disp, color=as.character(cyl))) + geom_point()

legendp <- ggpubr::get_legend(p)

根据legendp$grobs[[1]],我们知道标签可能存储在grob 9到11中:

legendp$grobs[[1]]
# TableGrob (7 x 6) "layout": 11 grobs
#     z     cells       name                                grob
# 1   1 (1-7,1-6) background rect[legend.background..rect.19172]
# 2   2 (2-2,2-5)      title             gTree[GRID.gTree.19173]
# 3   3 (4-4,2-2) key-3-1-bg        rect[legend.key..rect.19163]
# 4   4 (4-4,2-2)  key-3-1-1           points[GRID.points.19164]
# 5   5 (5-5,2-2) key-4-1-bg        rect[legend.key..rect.19166]
# 6   6 (5-5,2-2)  key-4-1-1           points[GRID.points.19167]
# 7   7 (6-6,2-2) key-5-1-bg        rect[legend.key..rect.19169]
# 8   8 (6-6,2-2)  key-5-1-1           points[GRID.points.19170]
# 9   9 (4-4,4-4)  label-3-3             gTree[GRID.gTree.19174]
# 10 10 (5-5,4-4)  label-4-3             gTree[GRID.gTree.19175]
# 11 11 (6-6,4-4)  label-5-3             gTree[GRID.gTree.19176]

然后我们可以unlist grobs 9到11(使用which(grepl("label", legendp$grobs[[1]]$layout$name))动态输出目标grobs)。标签存储在一个子列表元素下,其名称以“children.guide.label”开头,以“label”结尾,因此我们可以grep该模式来获取目标标签。

legendp_grobs9_11 <- unlist(legendp$grobs[[1]]$grobs[which(grepl("label", legendp$grobs[[1]]$layout$name))])

unname(legendp_grobs9_11[grepl("children.guide.label.*text.*label$", names(legendp_grobs9_11))])
# [1] "4" "6" "8"

另一个例子来说明它的工作原理。

library(tidyverse)
library(ggpubr)

p2 <- ggplot(diamonds, aes(cut, price, col = cut)) + geom_point()
p2

legendp2 <- get_legend(p2)
legendp2_grobs13_17 <- unlist(legendp2$grobs[[1]]$grobs[which(grepl("label", legendp2$grobs[[1]]$layout$name))])
unname(legendp2_grobs13_17[grepl("children.guide.label.*text.*label$", names(legendp2_grobs13_17))])
#> [1] "Fair"      "Good"      "Very Good" "Premium"   "Ideal"

创建于2023-06-09使用reprex v2.0.2

相关问题