在 ggplot2 中重新着色图例文本背景
Recoloring Legend Text Background in ggplot2
使用此代码:
ggplot(mtcars, aes(x=mtcars$mpg, y = mtcars$wt, color = as.factor(mtcars$cyl))) + geom_point()
我得到一个很好的情节,看起来像这样:
出于我的目的,我希望图例看起来像这样:
换句话说,我希望颜色图例的图例文本背景与标签各自的颜色相匹配。有什么简单的方法可以做到这一点吗?
编辑:在我当前的代码中,我使用 ggtext
和 scale_color_hue(labels = colorLabels)
,其中 colorLabels
看起来像这样 <span style='color:red'>MyLabel</span>
来使文本本身着色,但我不太喜欢它,我想看看我对交换颜色的感觉。将 color:red
切换为 background-color:red
只会删除文本颜色,实际上不会为背景着色。
这是一个肮脏的技巧,因为 ggplot
没有提供 API 来更改标签的背景。
免责声明: 此方法假定基础 grobs
的特定结构,可能无法保证。因此,请谨慎使用。
library(ggplot2)
library(grid)
library(gtable)
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
geom_boxplot()
## 1. Store ggplot object as grob
g <- ggplotGrob(p)
## 2. Find and retrieve the guidebox and guides
guide <- g$grobs[[which(g$layout$name == "guide-box")]]
guides <- guide$grobs[[which(guide$layout$name == "guides")]]
## 3. Get the fill colors of the guide
## N.B. This works in this toy example because the key has a fill property,
## this may be different for other geoms
cols <- vapply(guides$grobs[grep("^key.+[^b][^g]$", guides$layout$name)],
function(gt) gt$gp$fill, character(1))
## 4. Get the positions of the labels
pos <- guides$layout[grep("^label", guides$layout$name),
c("t", "l", "b", "r", "z")]
## 5. Add colored rects below the labels
## N.B. These span the width of labels
## some more work would be needed to make them bigger and/or center the labels
for (i in seq_along(cols)) {
guides <- gtable_add_grob(guides,
rectGrob(gp = gpar(fill = cols[i])),
pos[i, "t"],
pos[i, "l"],
pos[i, "b"],
pos[i, "r"],
pos[i, "z"] - 1,
name = paste0("key-bg-", i))
}
## 6. Write back the guides to the original object
guide$grobs[[which(guide$layout$name == "guides")]] <- guides
g$grobs[[which(g$layout$name == "guide-box")]] <- guide
## 7. Draw the graph
grid.draw(g)
使用此代码:
ggplot(mtcars, aes(x=mtcars$mpg, y = mtcars$wt, color = as.factor(mtcars$cyl))) + geom_point()
我得到一个很好的情节,看起来像这样:
出于我的目的,我希望图例看起来像这样:
换句话说,我希望颜色图例的图例文本背景与标签各自的颜色相匹配。有什么简单的方法可以做到这一点吗?
编辑:在我当前的代码中,我使用 ggtext
和 scale_color_hue(labels = colorLabels)
,其中 colorLabels
看起来像这样 <span style='color:red'>MyLabel</span>
来使文本本身着色,但我不太喜欢它,我想看看我对交换颜色的感觉。将 color:red
切换为 background-color:red
只会删除文本颜色,实际上不会为背景着色。
这是一个肮脏的技巧,因为 ggplot
没有提供 API 来更改标签的背景。
免责声明: 此方法假定基础 grobs
的特定结构,可能无法保证。因此,请谨慎使用。
library(ggplot2)
library(grid)
library(gtable)
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
p <- ggplot(ToothGrowth, aes(x=dose, y=len, fill=dose)) +
geom_boxplot()
## 1. Store ggplot object as grob
g <- ggplotGrob(p)
## 2. Find and retrieve the guidebox and guides
guide <- g$grobs[[which(g$layout$name == "guide-box")]]
guides <- guide$grobs[[which(guide$layout$name == "guides")]]
## 3. Get the fill colors of the guide
## N.B. This works in this toy example because the key has a fill property,
## this may be different for other geoms
cols <- vapply(guides$grobs[grep("^key.+[^b][^g]$", guides$layout$name)],
function(gt) gt$gp$fill, character(1))
## 4. Get the positions of the labels
pos <- guides$layout[grep("^label", guides$layout$name),
c("t", "l", "b", "r", "z")]
## 5. Add colored rects below the labels
## N.B. These span the width of labels
## some more work would be needed to make them bigger and/or center the labels
for (i in seq_along(cols)) {
guides <- gtable_add_grob(guides,
rectGrob(gp = gpar(fill = cols[i])),
pos[i, "t"],
pos[i, "l"],
pos[i, "b"],
pos[i, "r"],
pos[i, "z"] - 1,
name = paste0("key-bg-", i))
}
## 6. Write back the guides to the original object
guide$grobs[[which(guide$layout$name == "guides")]] <- guides
g$grobs[[which(g$layout$name == "guide-box")]] <- guide
## 7. Draw the graph
grid.draw(g)