如何在 ggplot2 的图例中插入表达式?:: 正确的颜色 + 多条线和点

How Insert an expression in legend in ggplot2?:: correct color + multiple lines and point

我是 R 的新手,无法更正下图。 Xb_exp,它应该有蓝点。 Xb_dw,红色实线。 Xb_f,虚线。 Xb_s,长划线。 图例表达式应如带下标所示。 我无法纠正它。 有办法吗?

enter image description here

my data
CA <- c(3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)
Xb_exp <- c(0.0231,0.0519,0.0839,0.1197,0.1595,0.1996,0.2384,0.2772,0.3153,0.3520,0.3887,0.4254,0.4615,0.4978,0.5339,0.5685,0.6000,0.6279,0.6528,0.6762,0.6974,0.7166,0.7346,0.7516,0.7669,0.7810,0.7940,0.8059)
Xb_dw <- c(0.0160,0.0516,0.0886,0.1259,0.1633,0.2006,0.2377,0.2749,0.3122,0.3496,0.3870,0.4245,0.4617,0.4984,0.5339,0.5678,0.5996,0.6288,0.6551,0.6786,0.6994,0.7179,0.7346,0.7499,0.7641,0.7774,0.7899,0.8018)
Xb_f <- c(0.0021,0.0031,0.0046,0.0067,0.0095,0.0131,0.0177,0.0234,0,0387,0.0483,0.0591,0.0709,0.0832,0.0955,0.1073,0.1181,0.1272,0.1345,0.1398,0.1443,0.1456,0.1468,0.1474,0.1476,0.1477,0.1477,0.1477,0.1477)
Xb_s <- c(0.0139,0.0484,0.0839,0.1192,0.1538,0.1874,0.2200,0.2515,0.2818,0.3108,0.3387,0.3653,0.3908,0.4151,0.4383,0.4604,0.4815,0.5015,0.5206,0.5387,0.5559,0.5722,0.5877,0.6024,0.6164,0.6264,0.6421,0.6040)

dat <- c(CA, Xb_exp, Xb_dw, Xb_f, Xb_s)

my code

labels =  c(expression(X[b_exp]),expression(X[b_dw]),expression(X[b_f]),expression(X[b_s]))
color4 <- c("Xb_exp"="#3C5488FF", "Xb_dw"="#DC0000FF", "Xb_f"="#00A087FF", "Xb_s"="#4DBBD5FF")
Xb_D1 <- ggplot(data = dat) +
  theme_bw() +
  labs(x="Crank position (ºCA)", y= bquote('Burn fraction ('~X[b]~')')) +
  geom_point(aes(x=CA, y=Xb_exp, colour="Xb_exp"), size=3) +
  geom_line(aes(x=CA, y=Xb_dw,colour="Xb_dw"), size=1,linetype="solid") +
  geom_line(aes(x=CA, y=Xb_f,colour="Xb_f"), size=1,linetype="dotted") +
  geom_line(aes(x=CA, y=Xb_s,colour="Xb_s"), size=1,linetype="longdash") +
  scale_colour_manual(values=color4, labels=labels) +
  theme(legend.title = element_blank(),legend.position = c(0.8, 0.5), 
        legend.text = element_text(size = 12)) +
  scale_x_continuous(limits = c(2,80))
plot(Xb_D1)

ggplot() 需要数据框而不是向量。如果您修改代码:

dat <- data.frame(CA, Xb_exp, Xb_dw, Xb_f, Xb_s)

并更正 Xb_f 矢量中的拼写错误

Xb_f <- c(0.0021,0.0031,0.0046,0.0067,0.0095,0.0131,0.0177,0.0234,0.0387,0.0483,0.0591,0.0709,0.0832,0.0955,0.1073,0.1181,0.1272,0.1345,0.1398,0.1443,0.1456,0.1468,0.1474,0.1476,0.1477,0.1477,0.1477,0.1477)

您的剩余代码将正常工作,但可以使用下面的 tidyverse 方法更简单地实现。使用 pivot_longer 将 y 变量与 x 变量叠加。

dat %>% 
pivot_longer(Xb_exp:Xb_s) %>%
 ggplot(aes(x = CA, y = value, colour = name)) +
 geom_point() + 
 geom_line() +
 scale_colour_manual(values=color4, labels=labels) +
 theme_bw() +
 theme(legend.title = element_blank(),legend.position = c(0.8, 0.5),
 legend.text = element_text(size = 12)) +
 scale_x_continuous(limits = c(2,80)) + 
 labs(x="Crank position (ºCA)", y= bquote('Burn fraction ('~X[b]~')')) ```

您的代码中存在一些错误,表明您没有尝试粘贴的内容。

  1. 0,0387, 在你的数据中应该是 0.0387, 否则没有什么是正确的(那里没有数据测量几百)
  2. c(CA, ... ) 应该是 data.frame( CA, ... )

现在,第一个问题是您自己完成了所有繁重的工作,而 ggplot 坐在那里无所事事。它旨在按组设置颜色和线型。但是,您需要先转换数据才能充分利用它:


library(tidyr)

CA <- c(3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30)
Xb_exp <- c(0.0231,0.0519,0.0839,0.1197,0.1595,0.1996,0.2384,0.2772,0.3153,0.3520,0.3887,0.4254,0.4615,0.4978,0.5339,0.5685,0.6000,0.6279,0.6528,0.6762,0.6974,0.7166,0.7346,0.7516,0.7669,0.7810,0.7940,0.8059)
Xb_dw <- c(0.0160,0.0516,0.0886,0.1259,0.1633,0.2006,0.2377,0.2749,0.3122,0.3496,0.3870,0.4245,0.4617,0.4984,0.5339,0.5678,0.5996,0.6288,0.6551,0.6786,0.6994,0.7179,0.7346,0.7499,0.7641,0.7774,0.7899,0.8018)
Xb_f <- c(0.0021,0.0031,0.0046,0.0067,0.0095,0.0131,0.0177,0.0234,0.0387,0.0483,0.0591,0.0709,0.0832,0.0955,0.1073,0.1181,0.1272,0.1345,0.1398,0.1443,0.1456,0.1468,0.1474,0.1476,0.1477,0.1477,0.1477,0.1477)
Xb_s <- c(0.0139,0.0484,0.0839,0.1192,0.1538,0.1874,0.2200,0.2515,0.2818,0.3108,0.3387,0.3653,0.3908,0.4151,0.4383,0.4604,0.4815,0.5015,0.5206,0.5387,0.5559,0.5722,0.5877,0.6024,0.6164,0.6264,0.6421,0.6040)

dat <- data.frame(CA, Xb_exp, Xb_dw, Xb_f, Xb_s)

color4 <- c("Xb_exp"="#3C5488FF", "Xb_dw"="#DC0000FF", "Xb_f"="#00A087FF", "Xb_s"="#4DBBD5FF")

linetypes <- c( Xb_dw="solid", Xb_f="dotted", Xb_s="longdash" )

dat2 <- pivot_longer( dat, cols=starts_with("Xb_") )
dat2.line <- dat2 %>% filter( name != "Xb_exp" )
dat2.point <- dat2 %>% filter( name == "Xb_exp" )

dat2 现在是一个 long 数据集,数据类别作为变量,而不是每个数据系列单独列。这就是 ggplot 喜欢它的方式:

dat2
# A tibble: 112 x 3
      CA name    value
   <dbl> <fct>   <dbl>
 1     3 Xb_exp 0.0231
 2     3 Xb_dw  0.016 
 3     3 Xb_f   0.0021
 4     3 Xb_s   0.0139
 5     4 Xb_exp 0.0519
 6     4 Xb_dw  0.0516
 7     4 Xb_f   0.0031
 8     4 Xb_s   0.0484
 9     5 Xb_exp 0.0839
10     5 Xb_dw  0.0886
# … with 102 more rows

然后我将数据拆分成点和线,只是为了不让情节代码比它必须的更难看:


Xb_D1 <- ggplot(data = dat2.line, aes(x=CA,y=value,color=name)) +
    theme_bw() +
    labs(x="Crank position (ºCA)", y= bquote('Burn fraction ('~X[b]~')')) +
    geom_point( data = dat2.point, size=3) +
    geom_line( aes(col=name,lty=name), size=1 ) +
    scale_colour_manual(values=color4) +
    scale_linetype_manual( values=linetypes, guide=FALSE ) +
    guides(
        color = guide_legend( override.aes=list( shape=c(NA,19,NA,NA), linetype=c("solid","solid","dashed","dotted") ) )
    ) +
    theme(legend.title = element_blank(),legend.position = c(0.8, 0.5),
          legend.text.align = 0,
          legend.text = element_text(size = 12)) +
    scale_x_continuous(limits = c(2,30))
print(Xb_D1)

  • 无需提供标签
  • 使用线型就像在 ggplot 中使用颜色一样,它只是另一个可以承载信息的通道(或者 aesthetic,因为他们喜欢在那里称呼它)
  • 将图例左对齐,那样看起来更好
  • 更复杂的是使用override.aes从图例类别中拿走不应该拥有它们的点数。

现在,我无法更改标签中数据系列的顺序,这可能会很麻烦。他们现在的顺序对你来说还可以吗?

具有讽刺意味的是,使用常规绘图进行设置非常简单:

鉴于以上所有数据:


linetypes4 <- c( Xb_exp=NA, Xb_dw="solid", Xb_f="dotted", Xb_s="longdash" )

plot(
    NA, type="n", xlim=c(0,30), ylim=c(0,0.8),
    xlab = "Crank position (ºCA)", ylab = bquote('Burn fraction ('~X[b]~')'),
    panel.first = grid()
)
with( dat, {
    points( x=CA, y=Xb_exp, pch=19, col=color4["Xb_exp"], size=3 )
    for( n in c("Xb_dw", "Xb_f", "Xb_s")) {
        lines( x=CA, y=get(n), lty=linetypes[n], col=color4[n], lwd=2 )
    }
})
legend(
    x = "right",
    legend = labels,
    col = color4,
    lty = linetypes4,
    pch = c(19,NA,NA,NA),
    box.lwd = 0,
    inset = .02
)