Как сделать так, чтобы пользовательские текстовые форматы 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('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)
а функция scales::scientific
, который можно использовать для принудительного использования научной нотации, которую я хочу избежать, но которая соответствует установленным мною спецификациям темы, возвращает вектор строк напрямую. Когда я изменяюfancy_scientific
чтобы вернуть вектор строк типа '2'%*%10^+01
они отображаются непосредственно на отображаемой оси Y.
Итак, вопрос в том, как мне сделать вывод fancy_scientific
функция соответствует моей спецификации темы?
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, 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
как element_markdown()
потому что, очевидно, есть некоторые значения по умолчанию, которые необходимо установить для других частей текста. Поэтому мне нужно специально установитьaxis.text.y
как element_markdown
. Это оставляет проблему отображения знака в реальном времени. Я задам следующий вопрос по этому поводу, потому что я ответил на вопрос о том, как применить полужирное форматирование, хотя мне также любопытно, как установить значения по умолчанию наelement_markdown
правильно, чтобы я мог использовать его для указания text
скорее, чем axis.text.y
.