Как сделать так, чтобы пользовательские текстовые форматы ggplot2 из функций масштабирования оси соответствовали спецификациям формата, установленным в theme ()?
Я хочу изменить научную нотацию на осях ggplot2 с формата 3.23e+6
на 3.23 × 10^6
. К счастью, здесь был дан ответ на этот вопрос: Как изменить форматирование чисел на оси с помощью 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, aes(displ, 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", который в этом случае печатается как expression('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)
функция while scales::scientific
, которую можно использовать для принудительного использования научной нотации того типа, которого я хочу избежать, но соответствует в соответствии с заданными мной спецификациями темы, возвращает вектор строк напрямую. Когда я изменяю, fancy_scientific
чтобы вернуть вектор строк, как будто '2'%*%10^+01
они непосредственно отображаются на отображаемой оси Y.
Итак, вопрос в том, как мне сделать вывод fancy_scientific
функции совместимым с моей спецификацией темы?
Ответы
Как предлагается в комментарии, способ сделать это - ggtext
package.
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, aes(displ, 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", "'\\1'e", l)
. Я получаю сообщение об ошибке, когда указываю text
as, element_markdown()
потому что, очевидно, есть некоторые значения по умолчанию, которые необходимо установить для других частей текста. Поэтому я должен специально установить axis.text.y
как element_markdown
. Остается проблема отображения знака в реальном времени. Я задам следующий вопрос по этому поводу, потому что я ответил на вопрос о том, как применить полужирное форматирование, хотя мне также интересно, как правильно установить значения по умолчанию, element_markdown
чтобы я мог использовать его для указания, text
а не axis.text.y
.