Как сделать так, чтобы пользовательские текстовые форматы 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.

Другие вопросы по тегам