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 '&lt;fc&gt;&lt;be&gt;&lt;8d&gt;&lt;b6&gt;&lt;88&gt;&lt;bc&gt; 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)等

在ggplot2中用bquote折叠字幕

如何将上标添加到R中的复杂轴标签

如何在 ggplot2 的多面图的单个标签中使用特殊字符、上标或下标?

使用ggplot2更改R中的x轴刻度标签[重复]