首页 > 解决方案 > 从 R 中的乳胶表达式向量创建 ggplot2 图例

问题描述

我有以下 R 代码,我希望传说中的 beta_i 是实际的希腊字母 beta。请忽略dansih评论。该代码应该显示岭回归的解决方案路径。实际代码要长得多,有几个情节相同的问题。

library(latex2exp)
library(glmnet)
library(MASS)
library(ggplot2)
library(reshape)
library(gridExtra)

set.seed(10)
Y = rnorm(100)
Y = scale(Y)
X=matrix(rnorm(100*8),ncol=8)
X = scale(X)

fitR = glmnet(X,Y, alpha = 0)
beta = coef(fitR)

temp = as.data.frame(as.matrix(beta)) #Laver til dataframe
temp$coef = row.names(temp) #Danner ny kolonne med koefficientnavne
temp = temp[temp$coef != "(Intercept)",] #Fjerner interceptet, der er 0, da normaliseret.
temp = reshape::melt(temp, id = "coef") #Slår de 100 tabeller sammen
temp$variable = as.numeric(gsub("s", "", temp$variable)) #Omdøber variabelnavne
temp$lambda = fitR$lambda[temp$variable+1] #Henter lambdaer
temp$coef = paste("beta_", gsub("V", "", temp$coef), sep="")


plot1 = ggplot(temp, aes(lambda, value, color = coef)) + 
    xlim(0,75) +
    geom_line() + 
    ggtitle(TeX("Ridge estimater mod $\\lambda$"))+
        xlab(TeX("$\\lambda$")) + ylab("Estimat")+
guides(color = guide_legend(title = "")) +
        theme_bw() + 
        theme(legend.key.width = unit(3,"lines"))

grid.arrange(plot1)

重要的向量temp$coef 是一个由 500 个 beta_i 值组成的向量,其中 i=1,...8。我试过没有运气写:

ggplot(temp, aes(lambda, value, color = paste('TeX("$\\', coef, '$")', sep=''))

但这会导致错误:“Fejl:无法将 ggproto 对象添加在一起。您是否忘记将此对象添加到 ggplot 对象?”。

受此和此帖子的启发,我替换了

guides(color = guide_legend(title = "")) +

scale_color_discrete(labels = parse(text= paste("beta[", 1:8, "]", sep=""))) +

这确实解决了我的问题。但是我有两个问题。首先,当我在其余代码中使用 LaTeX 时,我最终使用了非 LaTeX 表示法“beta[i]”而不是乳胶风格的“beta_i”。其次,这仅有效,因为在我的情况下, temp$coef 中的所有入口都包含“beta_i”。如果这 8 个入口是

temp$coef = c("alpha_1", "beta_2", ..., "theta_8")

那么我将无法做到这一点。

所以我的问题是: 给定一个适合乳胶的表达式向量(例如 c(alpha_1, ..., theta_8)),有没有办法使用这个向量的名称在 ggplot 中构建一个图例?

由于这是我在这里的第一篇文章,如果我需要更改任何内容,请告诉我。


根据我尝试使用的 user2554330 的评论进行 编辑scale_color_discrete(labels = TeX(temp$coef)) +: 它不会给出任何错误,但它不会在图例中显示任何名称。

使用$...$周围temp$coef给出错误: Fejl: uventet '$' in:" xlab(TeX("$\\lambda$")) + ylab("Estimat")+ scale_color_discrete(labels = TeX($" 写作scale_color_discrete(labels = TeX(\\temp$coef)) +给出了类似的错误。

我也尝试过使用: scale_color_discrete(labels = TeX(paste('$\\', unique(temp$coef), '$', sep=''))) +

但这只是在传说中写了非希腊语 beta_1, ..., beta_8。

最后写:

scale_color_discrete(labels = TeX(unique(temp$coef)))

达到了一半的目标。在传说中它写为 beta_i,其中 i 实际上是一个下标。

标签: rggplot2

解决方案


这有点棘手。这个想法是您可以使用labelsin的函数scale_color_discrete(),并且您希望该函数将之类的内容beta_1转换为 R 表达式以用作标签。这似乎有效:

 toLabel <- function(x) 
   TeX(paste0("$\\", x, "$"))

然后在scale_color_discrete

ggplot(temp, aes(lambda, value, color = coef)) + 
  xlim(0,75) +
  geom_line() + 
  ggtitle(TeX("Ridge estimater mod $\\lambda$"))+
  xlab(TeX("$\\lambda$")) + ylab("Estimat")+
  theme_bw() + 
  theme(legend.key.width = unit(3,"lines")) +
  scale_color_discrete(labels = toLabel)

这给了我这个传说:

截屏


推荐阅读