R: ggplot2: facet_grid: 如何在少数标签中包含数学表达式?

14

我在ggplot2中遇到了问题。我阅读了大多数相关的帖子,也尝试了很多方法,但没有找到任何真正的解决方案。

我想在我的facet_grids标签中包含数学表达式,使用ggplot2

  • 在原始文件中,我无法写入名称µg.L-1
  • 在标题和轴中,我可以这样做,例如:qplot(day, activity, data=a) +xlab(expression("100 µg "*.L^"-1"*"")):这个工作得很好。
  • 对于facet_labels我该怎么办? 我可以设置级别并重命名标签因子,但是不考虑表达式,例如:

    levels(a$group) <- c("control", expression("100 µg "*.L^"-1"*""))

    qplot(…, facets=~group)

结果:

图像上的分面1标签被写成了:control

图像上的分面2标签被写成了:"100 µg ".L^"-1"""…

而我不想要那样。

我不想使用facet_grid(.~group,labeller=label_bquote(…)),因为我不想让所有标签都遵循相同的表达式。我想手动逐个编辑标签...

我尝试使用bquote(…)代替expression(…),但是结果仍然错误。

有人对此有什么线索吗?


以下是示例:我定义了一个数据框:

activity<- as.numeric(c("44","41","48","43","42","45","44","39", "47", "68", "88", "57"))
group<-c("first","first","first","first","first","first",
         "second","second","second","second","second","second")
day<- c("0", "0", "0", "20","20", "20","0", "0", "0", "20","20", "20" )
a<-data.frame(activity, group, day)

我在绘图:

require (ggplot2) 

qplot(day, activity, facets=.~group, data=a, ylim=c(25,90))

enter image description here

我想要更改分面标签和y轴的名称:

levels(a$group)<- c("control", expression("100 µg "*.L^"-1"*""))
qplot(day, activity, facets=.~group, data=a, ylim=c(25,90),
  ylab=expression("fmol "*.µl^"-1"*""))

在此输入图像描述

它在y轴上表现良好,但是对于分面标签,它不起作用...有什么线索吗?


如果您提供一个更具可重现性的示例,并附上我们可以复制/粘贴到R中重新创建问题的样本输入数据,那么帮助您将更加容易。 - MrFlick
Paul - 请查看这篇文章“在ggplot2中将分面标签更改为数学公式”https://dev59.com/SWct5IYBdhLWcg3wmOZN - Technophobe01
@MrFlick:谢谢,更多细节请见下文... - SkyR
@Technophobe01:谢谢,我看到了这篇帖子,但是在我的情况下无法弄清楚如何操作... - SkyR
1
这段代码是否有效:ggplot(a, aes(day, activity)) + facet_grid(.~group, labeller= label_parsed) - user20650
@paul - 关于 https://dev59.com/SWct5IYBdhLWcg3wmOZN 的问题,重要的细节在最后两个条目中。即 # parse original labels facet_wrap_labeller(p, labeller = label_parsed) 和 "As of ggplot2 2.1.0 labeller has been implemented for facet_wrap."。抱歉,我应该更明确。 - Technophobe01
2个回答

17

提议的解决方案:

前提条件:

activity <- as.numeric(c("44", "41", "48", "43", "42", "45", 
  "44", "39", "47", "68", "88", "57"))
group <- c("first", "first", "first", "first", "first", "first", 
  "second", "second", "second", "second", "second", "second")
day <- c("0", "0", "0", "20", "20", "20", "0", "0", "0", "20", 
  "20", "20")
a <- data.frame(activity, group, day)
require(ggplot2)
levels(a$group) <- c("control", expression("100 µg " * .L^"-1" * ""))

解决方案:

p1 <- qplot(day, activity, data = a)
p1 + facet_grid(. ~ group, labeller = label_parsed)

结果:

enter image description here

解释

我们将标签结构创建为字符串,其中我们创建一个公式,注意使用~替换空格...然后通过设置labeller = label_parsed告诉facet_grid()将传递给它的标签字符串解析为公式...

注意:显示细节在?plotmath中有描述,但请注意geom_text()facet_grid()使用的是字符串而非表达式。

希望以上内容有所帮助。

参考资料:

请参阅Hagley Wickham关于标签制作程序的页面:https://github.com/hadley/ggplot2/wiki/labeller


非常感谢,这正是我在寻找的,并且它完美地运行。我以为“label_parsed”将所有标签放在同一个数学表达式中,但实际上它“分析”语法结构... 谢谢;) - SkyR
太好了 - Paul,你能否将其标记为已解决(Tick this solved your problem.)?这将有助于其他人找到答案。 - Technophobe01
这太棒了...也可以使用bquote(),例如:factor( df$measure, levels = c("area", "length"), labels = c(bquote(area ~~ (cm^2)), bquote(length ~~ (cm)))) - Brian D
当前标签器文档:https://ggplot2.tidyverse.org/reference/labeller.html - dfrankow

10
您可以使用label_parsed,前提是您的所有标签都是有效的表达式(如果需要,您可以将文本放在引号中)。
library(ggplot2) 
levels(a$group)<- c("'control test'", "100~mu*g*'.L'^-1")
ggplot(a) + facet_grid(.~group, labeller=label_parsed)

enter image description here


谢谢,label_parsed正是我正在寻找的,但我不知道如何正确处理它...谢谢;) - SkyR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接