मैं ggplot के साथ अक्ष पर संख्याओं के स्वरूपण को कैसे बदलूं?


131

मैं R और ggplot का उपयोग कुछ डेटा के स्कैप्लेटोट को आकर्षित करने के लिए कर रहा हूं, यह सब ठीक है सिवाय इसके कि y- अक्ष पर संख्याएं कंप्यूटर शैली के प्रतिपादक स्वरूपण के साथ आ रही हैं, अर्थात 4e + 05, 5e + 05, आदि। यह स्पष्ट है अस्वीकार्य है, इसलिए मैं इसे ५००,०००, ४००,००० इत्यादि के रूप में प्रदर्शित करना चाहता हूं। उचित प्रतिपादक अंकन भी स्वीकार्य होगा।

प्लॉट के लिए कोड इस प्रकार है:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

किसी भी मदद की बहुत सराहना की।


30
ggplot"स्पष्ट रूप से अस्वीकार्य" के रूप में डिफ़ॉल्ट विकल्पों का वर्णन करने से सावधान रहें । आप एक अलग प्रारूप के लिए एक व्यक्तिगत प्राथमिकता है मतलब है । प्रारूप में एक संख्या 4e+05वैज्ञानिक संकेतन है, और विभिन्न प्रकार के अनुप्रयोगों में पसंदीदा स्वरूपण होगा।
एंड्री

53
4e + 05 वैज्ञानिक संकेतन नहीं है, यह वैज्ञानिक अंकन के लिए एक कंप्यूटर सन्निकटन है। यह किसी भी प्रिंट जर्नल में स्वीकार्य नहीं होगा जिसके बारे में मैं सोच सकता हूं, इसलिए मैं इसे अपने शोध प्रबंध के लिए अस्वीकार्य मानता हूं।
जैक ऐडली

जवाबों:


126

एक अन्य विकल्प पैकेज के साथ कॉमा के साथ अपने अक्ष टिक लेबल को प्रारूपित करना है scales, और जोड़ना है

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

अपने ggplot स्टेटमेंट के लिए।

यदि आप पैकेज लोड नहीं करना चाहते हैं, तो उपयोग करें:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
कमाल है कि इस तरह के तुच्छ मुद्दे को एक नए पैकेज को लोड करने की आवश्यकता होती है।
ल्यूकोनाचो

FYI करें, यह भी स्केल_y_log10 (लेबल = स्केल: अल्पविराम) के साथ काम करता है, और मैं ggplot2 में अन्य पैमाने मान रहा हूं। महान युक्तियाँ!
दिक्लेटरीएट

66

मुझे ऐसा करने का एक और तरीका भी मिला जो कुल्हाड़ियों पर उचित 'x10 (सुपरस्क्रिप्ट) 5' संकेतन देता है। मैं इसे यहाँ पोस्ट कर रहा हूँ उम्मीद है कि यह कुछ के लिए उपयोगी हो सकता है। मुझे यहां से कोड मिल गया है, इसलिए मैं इसके लिए कोई श्रेय का दावा नहीं करता, यह ठीक ब्रायन डिग्स के पास जाता है।

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(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

10
यदि आप नहीं चाहते कि 0 को "0 x 10," के रूप में मुद्रित किया जाए, तो नीचे दी गई format(...)पंक्ति को जोड़ दें :l <- gsub("0e\\+00","0",l)
अर्ध-

1
यदि आप अन्य चीजों को विशेष बनाना चाहते हैं, तो एक अलग कंसोल में आपके मामले के लिए क्या रिटर्न देता है, इसका परीक्षण करते हुए, gsub()सीधे और अधिक जोड़ना आसान है । format()format()
अर्ध-बहिर्मुखी

3
इसे अंतिम gsubआदेश से पहले जोड़ें : # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)और इसके बाद: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)इसे प्रारूप में बनाने के लिए आमतौर पर कागजात में उपयोग किया जाता है।
जॉन_वेस्ट

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

जब मैं यह कोशिश करता हूं तो मुझे एक त्रुटि मिलती है कि फ़ॉर्मेटर अप्रयुक्त तर्क है? क्या इसके लिए एक और पैकेज या कुछ और चाहिए?
जैक ऐडली

4
मैंने उस कोड को शामिल करने library(scales)और उपयोग करने के लिए बदल दिया, commaजो उस फ़ंक्शन से बेहतर काम करना चाहिए जो मेरे पास पहले था।
DiscreteCircle

16

मुझे यहाँ खेल में देर हो गई है, लेकिन अगर कोई अन्य आसान समाधान चाहता है, तो मैंने ऐसे कार्यों का एक समूह बनाया, जिसे इस प्रकार कहा जा सकता है:

 ggplot + scale_x_continuous(labels = human_gbp)

जो आपको एक्स या वाई कुल्हाड़ियों (या वास्तव में किसी भी संख्या) के लिए मानव पठनीय संख्या देते हैं।

आप यहाँ फ़ंक्शन पा सकते हैं: Github Repo बस फ़ंक्शन को अपनी स्क्रिप्ट में कॉपी करें ताकि आप उन्हें कॉल कर सकें।


10

मुझे लगता है कि जैक एडली का सुझाया हुआ उत्तर उपयोगी है।

मैं एक और विकल्प फेंकना चाहता था। मान लें कि आपके पास कई छोटी संख्याओं के साथ एक श्रृंखला है, और आप सुनिश्चित करना चाहते हैं कि अक्ष लेबल पूर्ण दशमलव बिंदु लिखें (जैसे 5e-05 -> 0.0005), फिर:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 

23
एक अनाम फ़ंक्शन का उपयोग करके इसे छोटा किया जा सकता है: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})ऐसा कोई पूर्व-निर्धारित फ़ॉर्मेटर क्यों नहीं है, नरक जानता है।
eMPee584
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.