在 ggplot 轴类别标签中正确显示化学公式
Correct display of chemical formulae in ggplot axis category labels
我正在绘制一个数据集,其中化学式作为类别,以及与每个类别关联的值:
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()
或类似的)成功地完成了这个,并且我可以看到这个问题的各种线程,但相同的解决方案似乎不适用于类别标签。
更新:终于得到了正确的 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 创建
上次更新:用翻译 table 稍微更可扩展的代码替换代码以获得 bquote()
表达式。相同的基本想法,但现在不仅仅是标签中的硬接线,所以应该与过滤器、facet 等一起使用。
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)
我正在绘制一个数据集,其中化学式作为类别,以及与每个类别关联的值:
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()
或类似的)成功地完成了这个,并且我可以看到这个问题的各种线程,但相同的解决方案似乎不适用于类别标签。
更新:终于得到了正确的 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 创建上次更新:用翻译 table 稍微更可扩展的代码替换代码以获得 bquote()
表达式。相同的基本想法,但现在不仅仅是标签中的硬接线,所以应该与过滤器、facet 等一起使用。
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)