r - 从 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 实际上是一个下标。
解决方案
这有点棘手。这个想法是您可以使用labels
in的函数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)
这给了我这个传说:
推荐阅读
- wolfram-mathematica - 数学中的规则
- c# - 收到此错误消息“无法发送具有此动词类型的内容主体。”
- gradle - 如何在gradle中组合两个任务
- javascript - 如何在 JS 中使用 Event Loop 构造去抖动函数?
- asp.net - 无法使用 NLog 保存 aspnet-sessionid
- java - 致命异常:java.util.UnknownFormatConversionException Conversion = 'End of String'
- hibernate - 启发式完成:结果状态回滚;
- json - 我无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例
- python - 使用现有数据框中的值的新数据框
- list - 从 Lotus Notes 中读取所有类别