मैं ggplot2 को कस्टम स्केल फ़ंक्शंस से कस्टम टेक्स्ट फ़ॉर्मेट कैसे बना सकता हूं, थीम () में सेट किए गए फॉर्मेट स्पेसिफिकेशन्स का पालन करें?

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('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)जबकि फ़ंक्शन scales::scientific, जिसे मैं जिस तरह से बचना चाहता हूं, के वैज्ञानिक अंकन के लिए उपयोग किया जा सकता है, लेकिन अनुरूप मैं जो भी विशिष्टताओं को निर्धारित करता हूं, सीधे स्ट्रिंग्स के एक वेक्टर को वापस करता है। जब मैं fancy_scientificस्ट्रिंग्स के एक वेक्टर को वापस करने के लिए संशोधित करता हूं, जैसे '2'%*%10^+01कि वे सीधे प्रदर्शित वाई अक्ष पर प्रदान किए जाते हैं।

तो सवाल यह है कि मैं fancy_scientificफ़ंक्शन के आउटपुट को अपने थीम विनिर्देश के अनुरूप कैसे बनाऊं?

जवाब

JordanMandel Aug 20 2020 at 02:54

ऐसा करने का एक तरीका, जैसा कि टिप्पणी द्वारा सुझाया गया है, 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