ggplot中只有一个图例的斜体标签
Posted
技术标签:
【中文标题】ggplot中只有一个图例的斜体标签【英文标题】:Italicize labels of only one legend in ggplot 【发布时间】:2018-07-12 08:11:17 【问题描述】:我正在尝试用两个单独的图例来格式化一个情节。我有一个形状图例,用于我所有不同的分类群,还有一个颜色图例,用于它们所属的类别。我只想斜体化形状图例中的分类单元名称,而不是斜体化颜色图例中的类别名称。到目前为止,我可以使所有图例条目斜体或不使用此行:
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) 的操作。我倾向于对亚科使用刻面,对物种使用颜色,因此只生成一个图例: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"))
。
【参考方案1】:
您可以通过在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 个形状(我认为它们是完全可辨别的),但是这两个调用不能一起工作以产生所需的结果。关于如何使它们都起作用的任何想法?谢谢~ 在ggplot
中,每个aes
thetic 只能拨打一次scale_xxx
。因此,在您的情况下,您需要将scale_shape_discrete
替换为scale_shape_manual
,它采用相同的参数,包括guide
。
我曾尝试将手动形状值添加到 scale_shape_discrete,但没有成功;我忘了考虑在 scale_shape_manual 中指定指南的替代方法。完美运行,谢谢!以上是关于ggplot中只有一个图例的斜体标签的主要内容,如果未能解决你的问题,请参考以下文章