如何在 Ggplot2 标签中使用“符号 = 数字”和“字符 = 数字”

Posted

技术标签:

【中文标题】如何在 Ggplot2 标签中使用“符号 = 数字”和“字符 = 数字”【英文标题】:How do I Use "Symbol = Numeric" and "Character = Numeric" in Ggplot2 Label 【发布时间】:2021-12-20 17:01:16 【问题描述】:

我希望该图的列标题和行标题分别为phi = 0.8, phi = 0.9, phi = 0.95sd = 1, sd = 3, sd = 5, sd = 10phi 应该显示为希腊字母符号,而 sd 仍然是英文字母。

## simulate ARIMA(1, 0, 0)
set.seed(289805)
x1 <- arima.sim(n = 10, model = list(ar = 0.8, order = c(1, 0, 0)), sd = 1)
set.seed(671086)
x2 <- arima.sim(n = 10, model = list(ar = 0.9, order = c(1, 0, 0)), sd = 1)
set.seed(799837)
x3 <- arima.sim(n = 10, model = list(ar = 0.95, order = c(1, 0, 0)), sd = 1)
set.seed(289805)
x4 <- arima.sim(n = 10, model = list(ar = 0.8, order = c(1, 0, 0)), sd = 3)
set.seed(671086)
x5 <- arima.sim(n = 10, model = list(ar = 0.9, order = c(1, 0, 0)), sd = 3)
set.seed(799837)
x6 <- arima.sim(n = 10, model = list(ar = 0.95, order = c(1, 0, 0)), sd = 3)
set.seed(289805)
x7 <- arima.sim(n = 10, model = list(ar = 0.8, order = c(1, 0, 0)), sd = 5)
set.seed(671086)
x8 <- arima.sim(n = 10, model = list(ar = 0.9, order = c(1, 0, 0)), sd = 5)
set.seed(799837)
x9 <- arima.sim(n = 10, model = list(ar = 0.95, order = c(1, 0, 0)), sd = 5)
set.seed(289805)
x10 <- arima.sim(n = 10, model = list(ar = 0.8, order = c(1, 0, 0)), sd = 10)
set.seed(671086)
x11 <- arima.sim(n = 10, model = list(ar = 0.9, order = c(1, 0, 0)), sd = 10)
set.seed(799837)
x12 <- arima.sim(n = 10, model = list(ar = 0.95, order = c(1, 0, 0)), sd = 10)
xx <- 1:10

df <- data.frame(xx, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12)
reshapp <- reshape2::melt(df, id = "xx")

NEWDAT <- data.frame(y = reshapp$value, x = reshapp$xx, sd = rep(rep(c(sd=1, sd=3, sd=5, sd=10), each = 10), each = 3),phi = rep(rep(c(.8, .9, .95), each = 10), 4))

ggplot(NEWDAT, aes(x = x, y = y)) +  geom_line() +  geom_point() + labs(x = 'lb', y = 'RMSE') + facet_grid(sd ~ phi,  scales = "free_y") +
  theme_bw() + ggplot2::scale_y_continuous(expand = c(0.0, 0.00))

【问题讨论】:

伪RNG种子不用设置那么多次,一个,脚本开头就够了。 每个种子都是独一无二的,就像每个系列一样。 是的,我明白这一点,但如果您只设置一次,第二系列的值将不同于第一系列的值。其他所有人也一样。 好的,下次。请回答我的问题。 【参考方案1】:

部分答案是:使用此facet_grid 调用而不是您现在正在使用的调用。

  facet_grid(sd ~ phi,  scales = "free_y", labeller = . %>% label_both(sep = " = "))

使用bquote

  facet_grid(sd ~ phi,  scales = "free_y", 
             labeller = 
               label_bquote(rows = sigma == .(sd), cols = phi == .(phi))
  )

这将产生正确的标签。

答案灵感来自this post

【讨论】:

label_bquote 版本应该能满足您的需求。【参考方案2】:

[编辑以说明第三行代码中的重构]

一个快速的解决方法是使用 UTF8 编码表示的 Phi 创建或重命名分面键,再加上您想要的字符串的创建(即“Phi|SD = N”) 在这种情况下,我创建了一个新变量:

NEWDAT %>% 
    mutate(phi_label = paste0("\U03D5 = ", phi), #"\U03D5" represents the character "ϕ"
           sd_label = fct_reorder(.f = paste0("sd =", sd), .x = sd)) %>% 
    ggplot(aes(x = x, y = y)) +  geom_line() +  geom_point() + labs(x = 'lb', y = 'RMSE') + 
    facet_grid(sd_label ~ phi_label,  scales = "free_y") +
    theme_bw() + ggplot2::scale_y_continuous(expand = c(0.0, 0.00))

【讨论】:

检查为什么你的输出是sd = 1, sd = 10, sd = 3, sd = 5 完成了,丹尼尔。事实上,由于 lab_sd 现在是一个分类变量而不是数值变量,我们需要对其进行重构以在 facet 的行中获得预期的数值增量。 错误:mutate()sd_label 有问题。我sd_label = forecast::fct_reorder(.f = paste0("sd =", sd), .x = sd)。 x 'fct_reorder' 不是从 'namespace:forecast' 导出的对象 请重新开始你的 R 赛季。【参考方案3】:

这是一个解决方案,plotmath 仅使用标准字符,没有特殊的转义序列。

NEWDAT <- data.frame(y = reshapp$value, x = reshapp$xx, sd = rep(rep(c(sd=1, sd=3, sd=5, sd=10), each = 10), each = 3),phi = rep(rep(c(.8, .9, .95), each = 10), 4))
NEWDAT$sd <- factor(NEWDAT$sd, levels = NEWDAT$sd, labels = paste("sd ==", NEWDAT$sd))
NEWDAT$phi <- with(NEWDAT, factor(phi, levels = phi, labels = paste("phi ==", phi)))

ggplot(NEWDAT, aes(x = x, y = y)) +  
  geom_line() +  
  geom_point() + 
  scale_y_continuous(expand = c(0.0, 0.00)) +
  labs(x = 'lb', y = 'RMSE') + 
  facet_grid(
    sd ~ phi, 
    scales = "free_y",
    labeller = label_parsed
  ) +
  theme_bw() 

【讨论】:

以上是关于如何在 Ggplot2 标签中使用“符号 = 数字”和“字符 = 数字”的主要内容,如果未能解决你的问题,请参考以下文章

如何在绘图标题或标签中为文本加下划线? (ggplot2)

如何在不改变绘图宽度的情况下使用 ggplot2 在 R 中添加可变大小的 y 轴标签?

如何使用 ggplot2 + directlabels 为标签使用自定义名称

如何在ggplot2中并排条形图上居中标签

使用 purrr 时如何自定义 ggplot2 facet_grid 标签中的文本?

ggplot2中的角标签