如何解决如何使用轴比例函数使ggplot2自定义文本格式遵循theme中设置的格式规范?
我想将ggplot2轴上的科学计数法从3.23e+6
更改为3.23 × 10^6
。值得庆幸的是,这里已经回答了这个问题:How do I change the formatting of numbers on an axis with ggplot?
在基本情况下效果很好。但是,当您要更改轴标签的格式时,它不起作用。此示例对此进行了说明:
library(tidyverse)
ggplot(mpg,aes(displ,hwy*10^9)) + geom_point()
#makes the scientific notation using "AeB" explicitly write out Ax10^B
fancy_scientific <- function(l) {
# turn in to character string in scientific notation
l <- format(l,scientific = TRUE)
# quote the part before the exponent to keep all the digits
l <- gsub("^(.*)e","'\\1'e",l)
# turn the 'e+' into plotmath format
l <- gsub("e","%*%10^",l)
# return this as an expression
parse(text=l)
}
ggplot(mpg,hwy*10^9)) +
theme_classic() +
geom_point() +
scale_y_continuous(labels= fancy_scientific) +
theme(text = element_text(face = "bold"))
哪个产量:
问题是Y轴文本未按对theme
的调用中指定的粗体显示。当我使用browser
来查看fancy_scientific
内部发生的事情时,我看到它返回了一个“表达式”类的对象,在这种情况下,该对象被打印为
expression('2'%*%10^+01,'3'%*%10^+01,'4'%*%10^+01)
,而函数scales::scientific
可用于强制执行我想避免的那种科学计数法,但符合我设置的任何主题规范,而函数fancy_scientific
直接返回字符串向量。当我修改'2'%*%10^+01
以返回像fancy_scientific
这样的字符串向量时,它们将直接呈现到显示的Y轴上。
所以问题是如何使{{1}}函数的输出符合我的主题规范?
解决方法
评论所建议的一种方法是ggtext
包。
library(tidyverse)
library(ggtext)
ggplot(mpg,aes(displ,hwy*10^9)) + geom_point()
#makes the scientific notation using "AeB" explicitly write out Ax10^B
fancy_scientific <- function(l) {
# turn in to character string in scientific notation
l <- format(l,scientific = TRUE)
# quote the part before the exponent to keep all the digits
l <- gsub("^(.*)e","'\\1'e",l)
# turn the 'e+' into plotmath format
l <- gsub("e","%*%10^",l)
# return this as an expression
parse(text=l)
}
ggplot(mpg,hwy*10^9)) +
theme_classic() +
geom_point() +
scale_y_continuous(labels= fancy_scientific) +
theme(text = element_text(face = "bold"),axis.text.y = element_markdown(face = "bold"))
但是,如果运行此代码,则会发现一些问题。开头的引号周围有引号,可以通过删除l <- gsub("^(.*)e",l)
中的单引号来消除。将text
指定为element_markdown()
时出现错误,因为显然需要为文本的其他部分设置一些默认值。因此,我必须将axis.text.y
专门设置为element_markdown
。这留下了显示实时标志的问题。我将询问有关此问题的后续问题,因为我已经回答了如何应用粗体格式的问题,尽管我也很好奇如何正确将默认值设置为element_markdown
,以便可以将其用于指定text
而不是axis.text.y
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。