ggplot 将图例的一部分斜体化为多行

ggplot italicize part of legend across multiple lines

我正在尝试 斜体 我的图例元素的一部分。我已经能够使用此 中的答案获得我想要的 italicized 子集,但这会导致文本显示方式出现问题。

这里是数据(稍作修改):

Behaviour   Repeatability   Age stage
Activity    0.1             PE  A
Activity    0.5             PE2 A
Activity    0.5             PW  B
Activity    0.5             A   C
Activity    0.4             A2  C
Activity    0.4             PW1 B
Aggression  0.2             PE  A
Aggression  0.3             PE2 A
Aggression  0.3             PW  B
Aggression  0.4             A   C
Aggression  0.3             A2  C
Aggression  0.0             PW1 B

这是情节(没有 斜体):

当我尝试斜体化基于此的括号中的图例文本时,情节变得混乱:

我用来获取此图的代码如下(减去不需要的格式):

ggplot(df, aes(x = stage, y = Repeatability, shape = Behaviour, colour=Age, linetype=Age)) + 
    geom_point() + 
    scale_colour_manual(values = c("#D55E00", "#0072B2", "black", "black", "#CC79A7", "black"), name = "Study", breaks=c("A","A2", "PE", "PE"=="PE2", "PW", "PE"=="PW1"),
    labels=c(
    (expression("Taylor et al. 2012", paste(italic("\n 366 adults")))),
    (expression("Boon et al. 2008", paste(italic("\n (71 adult females)")))), 
    (expression("This study", paste(italic("\n (102 juveniles)")))),
    "This study", 
    (expression("Kelley et al. 2015", paste(italic("\n (16 yearlings)")))), 
    "This study")) +
  theme(legend.key.size = unit(2.5, 'lines'))

axeman in the commentary: Multi-line expressions are not well supported. If you use expression with \n you'll get adjustment problems. This happens, since the ggplot works with the grid maintainers (check this git 问题所述)。

您可以使用 atop 在绘图中换行,这是一个 r 基本函数,也适用于 ggplot。以下代码已根据您的情况进行了调整。使用 italic 仍然需要该表达式。

library(ggplot2)
ggplot(df, aes(x = stage, y = Repeatability, shape = Behaviour, colour=Age, linetype=Age)) + 
  geom_point() + 
  scale_colour_manual(values = c("#D55E00", "#0072B2", "black", "black", "#CC79A7", "black"), name = "Study", breaks=c("A","A2", "PE", "PE"=="PE2", "PW", "PE"=="PW1"),
                      labels=c(
                        (expression(atop("Taylor et al. 2012", italic("(366 adults)")))),
                        (expression(atop("Boon et al. 2008", italic("(71 adult females)")))), 
                        (expression(atop("This study", italic("(102 juveniles)")))),
                        "thisstudy",
                        (expression(atop("Kelley et al. 2015", italic("(16 yearlings)")))),
                        "thisstudy"))+
  theme(legend.key.size = unit(2.5, 'lines'))

输出图如下

默认情况下,您的标签现在居中,因为 atop 创建了一个公式表达式。

如果您想将 expressionpaste 一起使用,您可以这样做:

(expression(paste("Taylor et al. 2012 \n", italic("(366 adults)"))))

但这种情况出现在错误的换行调整中。

也许你可以用这个改变对齐方式:

legend.text.align = 

其中 1 是,0 是