在 ggplot 中只给一个图例的标签加上斜体

5

我想对一张图表进行格式化,使其拥有两个独立的侧边图例。我有一个形状图例,用于显示不同分类群的形状,还有一个颜色图例,用于显示它们所属的类别。我想要在形状图例中仅给分类群名称设置斜体,而不给颜色图例中的类别名称设置斜体。到目前为止,我可以使用以下代码来控制图例中所有条目的字体是否为斜体:

plot + theme(legend.text = element_text(face = "italic"))

但是我不知道如何仅指定形状图例。 我认为 theme() 不适合,因为它会更改整个图的主题。 我还查看了 guides(),但似乎没有选项可以指定图例标签的字体。
一些示例数据和绘图:
species <- c("M. mulatta", "P. ursinus", "C. mitis", "C. guereza")
subfam <- c("Cercopithecine", "Cercopithecine", "Cercopithecine", "Colobine")
x <- rnorm(4, 1:10)
y <- rnorm(4, 2:20)
df <- data.frame(cbind(species, subfam, x, y))

ggplot(df, aes(x, y)) + geom_point(aes(shape = species, color = subfam), size = 4) +
  labs(shape = "Species", color = "Subfamily")

总之,我想把物种名称变成斜体字,但不需要将亚科名称变成斜体字。这似乎很简单...在ggplot中是否可能实现呢?
提前感谢!

这很困难,需要在绘图之前操作原始图形对象(grobs)。我倾向于使用facets来表示亚科和颜色来表示物种,从而只生成一个图例:library(tidyverse); df %>% rename(Species = species, Subfamily = subfam) %>% ggplot(aes(x, y)) + geom_point(aes(color = Species)) + facet_wrap(~Subfamily) + theme(legend.text = element_text(face = "italic")) - neilfws
1个回答

7
你可以通过在scale_shape_discrete*中设置element_text参数,包括字体等,来定制shape图例的标签。
ggplot(df, aes(x, y)) +
  geom_point(aes(shape = species, color = subfam), size = 4) +
  labs(shape = "Species", color = "Subfamily") +
  scale_shape_discrete(guide =
                         guide_legend(label.theme = element_text(angle = 0, face = "italic")))

在这里输入图片描述


*此方法也适用于scale_shape_manual,它还具有guide参数。请参见?scale_shape?scale_shape_manual


由于某种原因,我需要在element_text中指定angle,否则会出错。您可能还需要设置size


这是一个很好的解决方案!不幸的是,我的真实数据中还有另一个组件,我没有预料到它会影响解决方案,因此没有在我的原始问题中包括它。实际上,我有22个分类单元,而scale_shape_discrete()只允许最多6种不同的形状。我最初使用scale_shape_manual()来指定这22个形状(我认为它们非常可辨),但是这两个调用不能一起产生期望的结果。您有什么想法可以让它们同时工作吗?谢谢~ - Julia
ggplot中,每个aesthetic只能有一个对scale_xxx的调用。因此,在您的情况下,您需要将scale_shape_discrete替换为scale_shape_manual,它使用相同的参数,包括guide - Henrik
我曾尝试将手动形状值添加到scale_shape_discrete中,但没有成功;我忘记考虑在scale_shape_manual中指定guide的替代方案。现在完美运作了,谢谢! - Julia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接