【问题标题】:Correct display of chemical formulae in ggplot axis category labelsggplot 轴类别标签中化学式的正确显示
【发布时间】:2019-11-22 11:50:52
【问题描述】:

我正在绘制一个数据集,其中化学式作为类别,以及与每个类别相关的值:

data <- data.frame(compound = factor(c("SiO[2]", "Al[2]O[3]", "CaO")),
                value = rnorm(3, mean = 1, sd = 0.25))

我想让化学式中的下标在轴标签中正确显示。我尝试了各种解决方案,涉及bquote()label_parsed()scales::parse_format()ggplot2:::parse_safe(根据this thread),但所有这些都没有给我任何类别标签或一团糟。例如:

ggplot(data = data, aes(x = compound, y = value)) +
geom_col() +
scale_x_discrete(labels = scales::parse_format()) 

给出这个错误信息:

Error in parse(text = x, srcfile = NULL) : 1:6: unexpected symbol
1: Al[2]O
         ^

有人可以帮忙吗?我之前使用 x 轴和 x 轴标签(通过labs() 然后bquote() 或类似)成功地完成了此操作,并且我可以看到各种线程来解决该问题,但似乎没有相同的解决方案为类别标签工作。

【问题讨论】:

  • 最近刚写了一篇很长的bquote() 回答here。也许这会有所帮助?我想你会想把 bquote() 的东西隔离到 labs() 标签调用。
  • 哦,抱歉,刚刚注意到您已经尝试过labs()bquote()。如果您可以使用dput() 函数包含示例数据,那将有助于我和其他人回答您的问题。
  • 谢谢@ravic_。您链接到的示例略有不同,因为非标准字符位于轴标签本身中,而不是沿轴的类别中。我认为我的问题中的虚拟数据足以重现问题,但如果我遗漏了什么,请告诉我!
  • 比看起来更难,但我想我现在有一个可行的解决方案。
  • “比看起来更难” - 你没看错!

标签: r parsing ggplot2 subscript chemistry


【解决方案1】:

更新:终于找到了正确的parse() 例程,因此如果数据框中的化学品格式正确,则可以简单地解析它们以显示正确的标签。 (请注意,氧化铝需要波浪号 (~) 字符)。

library(tidyverse)
library(rlang)
#> 
#> Attaching package: 'rlang'
#> The following objects are masked from 'package:purrr':
#> 
#>     %@%, as_function, flatten, flatten_chr, flatten_dbl, flatten_int,
#>     flatten_lgl, flatten_raw, invoke, list_along, modify, prepend,
#>     splice
compounds = c("SiO[2]", "Al[2]~O[3]", "CaO[1]")
data <- tibble(compound = compounds,
               value = rnorm(3, mean = 1, sd = 0.25))
data %>%
  ggplot(aes(x = compound, y = value)) +
  geom_col() +
  scale_x_discrete(labels = rlang::parse_exprs)

reprex package (v0.3.0) 于 2019 年 11 月 21 日创建


以前的更新:用转换表稍微更可扩展的代码替换代码以获得bquote() 表达式。相同的基本思想,但现在不仅仅是标签中的硬连线,因此应该使用过滤器、构面等。


library(tidyverse)
compounds = c("SiO[2]", "Al[2]O[3]", "CaO[1]")
translation = c("SiO[2]" = bquote(SiO[2]),
                "Al[2]O[3]" = bquote(Al[2] ~ O[3]),
                "CaO[1]" = bquote(CaO))
data <- tibble(compound = compounds,
               value = rnorm(3, mean = 1, sd = 0.25))
ggplot(data = data, aes(x = compound, y = value)) +
  geom_col() + 
  scale_x_discrete(labels = translation)

【讨论】:

  • 谢谢!行得通。如果您/任何人有任何聪明的想法,仍然会对更系统地执行此操作的东西感兴趣(因为当涉及的公式比我的小代表更多的公式时)。但就目前而言,问题解决了。再次感谢。
  • 酷。感谢您的所有帮助!
  • 好的@TimM,这让我很烦,尽管它以前有点工作,但现在最后一次更新实际上做了你想要的——即解析你已经在你的数据框。呸。不再那样做。 :)
  • 谢谢。太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2020-08-19
  • 2020-10-24
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多