2011-01-15 12 views
25

के साथ log10 पैमाने पर केवल एक धुरी को ट्रांसफ़ॉर्म करें मुझे निम्न समस्या है: मैं एक बॉक्सप्लॉट पर एक असतत और निरंतर चर को विज़ुअलाइज़ करना चाहता हूं जिसमें बाद वाले कुछ चरम उच्च मान हैं। यह बॉक्सप्लॉट को अर्थहीन बनाता है (चार्ट और यहां तक ​​कि चार्ट का "बॉडी" बहुत छोटा है), यही कारण है कि मैं इसे लॉग 10 स्केल पर दिखाना चाहता हूं। मुझे पता है कि मैं विज़ुअलाइज़ेशन से चरम मूल्यों को छोड़ सकता हूं, लेकिन मेरा इरादा नहीं है।ggplot2

चलो हीरे डेटा के साथ एक सरल उदाहरण देखें:

m <- ggplot(diamonds, aes(y = price, x = color)) 

alt text

समस्या यहां गंभीर नहीं है, लेकिन मुझे आशा है कि आप कल्पना कर कारण है कि मैं एक log10 पैमाने पर मूल्यों देखना चाहेंगे सकता है । यह कोशिश करते हैं:

m + geom_boxplot() + coord_trans(y = "log10") 

alt text

आप देख सकते हैं y अक्ष log10 बढ़ाया है और ठीक लग रहा है लेकिन वहाँ जो साजिश बहुत ही अजीब बनाता एक्स अक्ष, के साथ एक समस्या है।

समस्या scale_log के साथ नहीं होती है, लेकिन यह मेरे लिए का विकल्प नहीं है, क्योंकि मैं इस तरह एक कस्टम फ़ॉर्मेटर का उपयोग नहीं कर सकता। उदा .:

m + geom_boxplot() + scale_y_log10() 

alt text

मेरा प्रश्न: क्या किसी को y अक्ष पर log10 पैमाने जो लेबल स्वतंत्र रूप से इस thread में एक formatter समारोह की तरह के साथ स्वरूपित किया जा सकता है के साथ boxplot प्लॉट करने के लिए एक समाधान पता है?


सवाल का संपादन जवाब और टिप्पणियों के आधार पर answerers मदद करने के लिए:

मैं क्या कर रहा हूँ वास्तव में के बाद: एक log10 तब्दील वैज्ञानिक नहीं लेबल के साथ धुरी (y)। मैं इसे (formatter=dollar) या किसी भी कस्टम प्रारूप की तरह लेबल करना चाहता हूं।

अगर मैं कोशिश @ हैडली के सुझाव मैं निम्नलिखित चेतावनी मिलती है:

> m + geom_boxplot() + scale_y_log10(formatter=dollar) 
Warning messages: 
1: In max(x) : no non-missing arguments to max; returning -Inf 
2: In max(x) : no non-missing arguments to max; returning -Inf 
3: In max(x) : no non-missing arguments to max; returning -Inf 
एक अपरिवर्तित y अक्ष लेबल की मदद से

:

alt text

+2

टी टोपी 'coord_trans' में एक बग है - लेकिन आप कस्टम लेबल को' scale_y_log10' 'निर्दिष्ट कर सकते हैं ... – hadley

+0

धन्यवाद @ हैडली, मुझे कुछ याद करना चाहिए लेकिन उदाहरण के लिए।'+ scale_y_continous (फॉर्मेटर = डॉलर) 'बस काम न करें। मैं दिए गए किसी भी फॉर्मेटर का परिणाम नहीं देख सकता हूं और मुझे अधिकतम 'अधिकतम (x) भी मिलता है: अधिकतम में कोई अनुपलब्ध तर्क नहीं; वापसी -Inf चेतावनी संदेश। – daroczig

+0

@ डारॉक्सजिग: फ़ॉर्मेटर तर्क के लिए मैंने जो उदाहरण देखे हैं उनमें सभी उद्धृत नाम शामिल हैं, इसलिए शायद 'फॉर्मेटर = "डॉलर" '? –

उत्तर

16

सरलतम सिर्फ फ़ॉर्मेटर तर्क नाम देने के लिए है लॉग फ़ंक्शन का:

m + geom_boxplot() + scale_y_continuous(formatter='log10') 

ED आईटी: या आप कि तो पसंद नहीं है अगर इन दोनों में से किसी में प्रकट होता है एक ही परिणाम देने के लिए: (एक है कि "$" संकेत डाल करने के लिए सफलतापूर्वक प्रयास किया त्यागकर के बाद इसके अलावा प्रयोगों:

m <- ggplot(diamonds, aes(y = price, x = color), log="y"); m + geom_boxplot() 
m <- ggplot(diamonds, aes(y = price, x = color), log10="y"); m + geom_boxplot() 

EDIT2 & 3 लॉग इन मूल्यों के सामने) में:

fmtExpLg10 <- function(x) paste(round_any(10^x/1000, 0.01) , "K $", sep="") 
ggplot(diamonds, aes(color, log10(price))) + 
geom_boxplot() + 
scale_y_continuous("Price, log10-scaling", formatter = fmtExpLg10) 

alt text

नोट पैकेज वाक्य रचना परिवर्तन के बारे में टिप्पणी में मध्य 2017 कहा:

scale_y_continuous (फ़ॉर्मेटर = 'log10') अब scale_y_continuous है (ट्रांस = 'log10') (ggplot2 v2.2.1)

+0

धन्यवाद @DWin, लेकिन यह वह नहीं है जिसे मैं ढूंढ रहा था। इस तरह वाई अक्ष 'लेबल लॉग 10 में परिवर्तित हो जाएंगे, लेकिन धुरी को परिवर्तित नहीं किया जाएगा। मैं क्या प्राप्त करना चाहता हूं: एक परिवर्तित अक्ष (वाई) वैज्ञानिक लेबल के साथ नहीं। – daroczig

+0

@daroczig: देखें कि यह अधिक संतोषजनक है या नहीं। मैंने शपथ ली होगी कि पहली बार मैंने अपना पहला समाधान चलाया था कि मुझे दस की शक्तियां मिलीं लेकिन मैं पुन: पेश नहीं कर सकता। हो सकता है कि मैं एक्स-पोजीशन को देखकर इतना ध्यान केंद्रित कर रहा हूं कि मैंने स्पष्ट समस्याओं को अनदेखा किया है –

+0

धन्यवाद @ डीडब्ल्यूएन, मैंने अभी आपके प्रस्तावों का परीक्षण किया है, लेकिन जैसा कि मैं देख सकता हूं कि दोनों कमांड वापस वही देते हैं: पहली छवि जो मैंने अपने प्रश्न से जुड़ी है। मैं क्या प्राप्त करना चाहता हूं: मेरे प्रश्न में अंतिम भूखंड (संख्या 3 और 4, जैसा कि वे समान हैं) अनुकूलन लेबल स्वरूपण के साथ। – daroczig

0

मुझे लगता है कि मैं इसे डेटा के साथ कुछ मैनुअल परिवर्तनों करके पिछले मिला दृश्य से पहले:

d <- diamonds 
# computing logarithm of prices 
d$price <- log10(d$price) 

और लघुगणक डेटा बाद में गणना करने के लिए 'वापस' एक फ़ॉर्मेटर बाहर काम:

formatBack <- function(x) 10^x 
# or with special formatter (here: "dollar") 
formatBack <- function(x) paste(round(10^x, 2), "$", sep=' ') 

और दिए गए फ़ॉर्मेटर साथ साजिश आकर्षित:

m <- ggplot(d, aes(y = price, x = color)) 
m + geom_boxplot() + scale_y_continuous(formatter='formatBack') 
समुदाय के लिए

alt text

क्षमा एक सवाल मैंने पहले हल किया जा सकता था के साथ आपको परेशान करने के लिए! मजाकिया हिस्सा यह है: मैं इस साजिश को एक महीने पहले काम करने के लिए कड़ी मेहनत कर रहा था लेकिन सफल नहीं हुआ। यहां पूछने के बाद, मुझे मिल गया।

वैसे भी, प्रेरणा के लिए @DWin के लिए धन्यवाद!

12

मैं एक ऐसी ही समस्या थी और इस पैमाने एक आकर्षण की तरह मेरे लिए काम किया:

breaks = 10**(1:10) 
scale_y_log10(breaks = breaks, labels = comma(breaks)) 

आप मध्यवर्ती स्तर, भी (10^3.5) चाहते हैं, तब तक आप स्वरूपण बदलाव करने की जरूरत है:

breaks = 10**(1:10 * 0.5) 
m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot() 
m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1)) 

को क्रियान्वित करने के बाद ::

enter image description here

+0

मैंने अभी यह देखा [बहुत ही समान समस्या] (http://stackoverflow.com/questions/2906855/how-to-override-ggplot2s-axis-formatting) एक ही समाधान है। –

+2

इस वैकल्पिक समाधान पर मेरा ध्यान इंगित करने के लिए धन्यवाद जो कि सरल 'डॉलर' फॉर्मेटर निर्दिष्ट करने या एक कस्टम लिखकर पूरा हो जाएगा: '+ scale_y_log10 (ब्रेक = ब्रेक, लेबल्स = डॉलर (ब्रेक))' – daroczig