Как сделать так, чтобы пользовательские текстовые форматы ggplot2 из функций масштабирования оси соответствовали спецификациям формата, установленным в theme ()?

Aug 18 2020

Я хочу изменить научную нотацию на осях 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функции совместимым с моей спецификацией темы?

Ответы

JordanMandel Aug 20 2020 at 02:54

Как предлагается в комментарии, способ сделать это - ggtextpackage.

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). Я получаю сообщение об ошибке, когда указываю textas, element_markdown()потому что, очевидно, есть некоторые значения по умолчанию, которые необходимо установить для других частей текста. Поэтому я должен специально установить axis.text.yкак element_markdown. Остается проблема отображения знака в реальном времени. Я задам следующий вопрос по этому поводу, потому что я ответил на вопрос о том, как применить полужирное форматирование, хотя мне также интересно, как правильно установить значения по умолчанию, element_markdownчтобы я мог использовать его для указания, textа не axis.text.y.