如何在ggplot的expression函数中传入索引向量值生成图例标签?
问题:将向量索引值传入ggplot的
expression()生成图例标签 操作步骤及问题
- 构造示例数据:
# 示例数据 data.frame(out = c(seq(0,1,.1), seq(0,0.5,.05), seq(0,0.1,.01)), time = seq(0,50,5), group = factor(rep(letters[1:3],each=11))) -> d
- 统计各组样本数量:
groupCounts <- table(d$group) # 输出结果: # a b c # 11 11 11
- 尝试设置图例标签时遇到问题:
使用scale_colour_manual()传入expression()时,groupCounts的索引值未在图例中显示,仅手动输入数字时正常:
ggplot(data = d, mapping = aes(x = time, y = out, colour = group)) + geom_line() + scale_colour_manual(labels = c(expression(paste("All (", italic("n"), "=", groupCounts[1], ")")), expression(paste("0 days (", italic("n"), "=", groupCounts[2], ")")), expression(paste("1-9 days (", italic("n"), "=", groupCounts[3], ")"))), values = c("#440154", "#31688E", "#35B779"))
解决方案
原方法失效的原因是expression()属于延迟解析,内部的groupCounts[1]不会被求值,仅作为符号保留。以下两种方法可解决问题:
方法1:使用bquote()嵌入求值后的变量
bquote()允许通过.()语法将变量求值后嵌入表达式:
# 构造带样本量的图例标签 labels <- c( bquote(paste("All (", italic("n"), "=", .(groupCounts[1]), ")")), bquote(paste("0 days (", italic("n"), "=", .(groupCounts[2]), ")")), bquote(paste("1-9 days (", italic("n"), "=", .(groupCounts[3]), ")")) ) ggplot(data = d, mapping = aes(x = time, y = out, colour = group)) + geom_line() + scale_colour_manual(labels = labels, values = c("#440154", "#31688E", "#35B779"))
方法2:先构造字符串再解析为表达式
先用sprintf()生成包含数值的字符串,再通过parse(text=)转换为ggplot可识别的表达式:
# 构造带数值的字符串模板,再解析为表达式 label_text <- c( sprintf("paste('All (', italic('n'), '=', %d, ')', sep='')", groupCounts[1]), sprintf("paste('0 days (', italic('n'), '=', %d, ')', sep='')", groupCounts[2]), sprintf("paste('1-9 days (', italic('n'), '=', %d, ')', sep='')", groupCounts[3]) ) labels <- parse(text = label_text) ggplot(data = d, mapping = aes(x = time, y = out, colour = group)) + geom_line() + scale_colour_manual(labels = labels, values = c("#440154", "#31688E", "#35B779"))
内容的提问来源于stack exchange,提问作者llewmills
相关产品推荐
相关产品推荐

