bquote轴标签ggplot2中的换行符和上标
Posted
技术标签:
【中文标题】bquote轴标签ggplot2中的换行符和上标【英文标题】:linebreak and superscript in bquote axis label ggplot2 【发布时间】:2019-07-26 17:24:18 【问题描述】:在查看了许多示例和大量尝试之后,我仍然无法将文本字符串和表达式组合成 ggplot2 轴标签,这正是我想要的。
我想在这里得到的是 x 轴标签:
成分:
parname <- 'FL.Red.Total'
xmean <- 123.34
xsigma <- 2580.23
要将数字更改为 10^n 符号,我使用以下公式:
sci_form10 <- function(x)
paste(gsub("e\\+", " \xB7 10^", scientific_format()(x)))
然后将通过以下方式构建名称:
labs( x = bquote(.(gsub('\\.', '\\ ', parname)) ~ " (a.u.) (" ~ mu ~ "=" ~ .(sci_form10(xmean)) ~ ", " ~ sigma ~ " =" ~ .(sci_form10(xsigma)) ~ ")" ))
我希望将 10^04
替换为 10,后跟上标中的 4,并在第一张图片显示的标签中添加换行符
测试代码:
library(ggplot2)
library(scales)
sci_form10 <- function(x)
paste(gsub("e\\+", " * 10^", scientific_format()(x)))
parname <- 'FL.Red.Total'
xmean <- 123.34
xsigma <- 2580.23
ggplot(mtcars, aes(x=mpg,y=cyl)) +
geom_point() +
labs( x = bquote(.(gsub('\\.', '\\ ', parname)) ~ " (a.u.) (" ~ mu ~ "=" ~ .(sci_form10(xmean)) ~ ", " ~ sigma ~ " =" ~ .(sci_form10(xsigma)) ~ ")" ))
给予:
附言我也试过了
sci_form10 <- function(x)
paste(gsub(".*e\\+", "10^", scientific_format()(x)))
它只给出 10^03 部分,看看这是否会改变我标签的结果,但不会。
【问题讨论】:
抱歉,这里有错字。应该是一个。而不是 , 并且方程的名称应该是相同的。现在进行更正。 我测试了你的代码。但是,它给出了一个错误Error in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : invalid multibyte string at '<fc><be><8d><b6><88><bc> 10^02'
嗯,我刚刚在重新启动 R 后测试了更新的代码块,但没有收到相同的错误(除了问题中的包外,没有加载任何其他包),但有时 \xB7 浮点似乎给问题。您可以尝试从函数 sci_form10() 中删除它
虽然无法测试,但可以选择bquote(atop(
我删除了问题代码 Akrun 中的问题符号。也许现在可以了。
【参考方案1】:
一个选项会用atop
换行以创建换行符
sci_form10 <- function(x)
paste(gsub("e\\+", " \u00B7 10^", scientific_format()(x)))
x1 <- sci_form10(xmean)
x2 <- sci_form10(xsigma)
lst1 <- strsplit(c(x1,x2), "\\s(?=10)", perl = TRUE)
pre <- sapply(lst1, `[`, 1)
post <- sapply(lst1, `[`, 2)
xmean1 <- parse(text = paste0("'", pre[1], "'"))[[1]]
xsigma1 <- parse(text = paste0("'", pre[2], "'"))[[1]]
post1 <- parse(text = post[1])[[1]]
post2 <- parse(text = post[2])[[1]]
ggplot(mtcars, aes(x=mpg,y=cyl)) +
geom_point() +
labs( x = bquote(atop(.(gsub("\\.", "\\ ",
parname))~"(a.u.)"~phantom(), "(" ~ mu~ " = "~ .(xmean1) ~ .(post1) ~ ", " ~ sigma ~ " = " ~ .(xsigma1) ~ .(post2)~ ")")))
-输出
【讨论】:
看起来不错。我将尝试弄清楚如何将 mu 和 sigma 的实际值也放入这一行 @Mark 我认为它应该适用于您的实际功能。对我来说,这是编码的一些问题 我现在把它改成了*,效果很好!感谢阿克伦的帮助 @Mark 好的,那就是labs( x = bquote(atop(.(gsub("\\.", "\\ ", parname))~"(a.u.)"~phantom(), "(" ~ mu~ " = "~ .(xmean1) ~ .(post1)*", " ~ sigma ~ " = " ~ .(xsigma1) ~ .(post2)~ ")")))
啊,用 * 代替 ~。谢谢【参考方案2】:
我有一些东西可以满足你的大部分需求。
changeSciNot <- function(n)
output <- format(n, digits=3, scientific = TRUE) # Transforms the number into scientific notation even if small
output <- sub("e", "*10^", output) # Replace e with 10^
output <- sub("\\+0?", "", output) # Remove + symbol and leading zeros on exponent, if > 1
output <- sub("-0?", "-", output) # Leaves - symbol but removes leading zeros on exponent, if < 1
output
# example data
parname <- "FL.Red.Total"
xmean <- 123.34
xsigma <- 2580.23
label <- bquote(atop(.(gsub("\\.", "\\ ", parname)) ~ "(a.u.)",
mu*"="*.(changeSciNot(xmean))*"," ~ sigma*"="*.(changeSciNot(xsigma))))
ggplot(mtcars, aes(x=mpg,y=cyl)) +
geom_point() +
labs(x = label)
changeSciNot
函数来自this thread。我在使用\xB7
进行乘法运算时遇到了一些问题,所以我离开了*
。我还硬编码了格式的位数,但您也可以将其作为参数。希望这能让您更接近所需的确切输出。
【讨论】:
当我使用您的方法时,我的闪亮应用程序再次遇到此错误,其中包含真实情节:“警告:grid.Call.graphics 中的错误:该系列的指标信息不可用/设备”明天会测试是什么原因造成的以上是关于bquote轴标签ggplot2中的换行符和上标的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化为长文本轴标签自动换行美化可视化结构实战:Wrap long text axis labels
R语言ggplot2可视化:ggplot2可视化为轴标签添加复杂下标(Subscripts)和上标(superscripts)离子化学符号(ionic chemical notation)等