2012-06-15 12 views
26

मैं ggplot2 का उपयोग कर एक उलट, log10 एक्स पैमाने के साथ एक साजिश बनाने के लिए करना चाहते हैं:ggplot2 में एक उलटा, log10 स्केल कैसे प्राप्त करें?

require(ggplot2) 
df <- data.frame(x=1:10, y=runif(10)) 
p <- ggplot(data=df, aes(x=x, y=y)) + geom_point() 

हालांकि, ऐसा लगता है कि मैं यह कर सकते हैं या तो एक log10 पैमाने या एक उलट पैमाने:

p + scale_x_reverse() + scale_x_log10() 

log10 scale, but not reversed

p + scale_x_reverse() 

reversed scale, but not log10

मुझे लगता है कि यह तार्किक है, अगर एक परत केवल एक पैमाने हो सकती है। और निश्चित रूप से मैं डेटाफ्रेम पर लॉग ट्रांसफॉर्म करके इसे हरा सकता हूं, df$xLog <- log10(df$x) लेकिन यह समाधान ggplot की भावना के विपरीत लगता है। Ggplot कॉल के बाहर डेटा ट्रांसफॉर्मेशन किए बिना इस तरह की साजिश पाने का कोई तरीका है?

+2

मैं इस रूप में अच्छी तरह से काम करने की उम्मीद है, लेकिन जाहिरा तौर पर अपनी एक सा जटिल। वहां एक [काम-आसपास] था (https://groups.google.com/forum/?fromgroups#!searchin/ggplot2/reverse$20log$20scale/ggplot2/AfMf9L9y9fc/Qu-FnJLJaagJ) जो कि में टूटा हुआ प्रतीत होता है सबसे हालिया संस्करण। यदि @ कोहस्के या कोई अन्य समाधान के साथ नहीं आ सकता है, तो एक अच्छा फीचर अनुरोध कर सकता है। – joran

उत्तर

43

जो लिंक ने अपनी टिप्पणी में दिया वह लिंक सही विचार (अपना स्वयं का परिवर्तन बनाएं) देता है, लेकिन scales पैकेज के संबंध में पुराना है जो ggplot2 अब उपयोग करता है। log_trans और मार्गदर्शन और प्रेरणा के लिए तराजू पैकेज में reverse_trans को देखते हुए, एक reverselog_trans समारोह बनाया जा सकता है:

p + scale_x_continuous(trans=reverselog_trans(10)) 

जो साजिश देता है::

library("scales") 
reverselog_trans <- function(base = exp(1)) { 
    trans <- function(x) -log(x, base) 
    inv <- function(x) base^(-x) 
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
       log_breaks(base = base), 
       domain = c(1e-100, Inf)) 
} 

इस रूप में बस इस्तेमाल किया जा सकता

enter image description here

यह दिखाने के लिए थोड़ा अलग डेटा सेट का उपयोग करके कि अक्ष निश्चित रूप से है निरस्त किया गया:

DF <- data.frame(x=1:10, y=1:10) 
ggplot(DF, aes(x=x,y=y)) + 
    geom_point() + 
    scale_x_continuous(trans=reverselog_trans(10)) 

enter image description here

+0

मुझे डर है कि यह समाधान अब काम नहीं करता है: reverselog_trans (10) में त्रुटि: फ़ंक्शन "trans_new" नहीं मिला स्पष्ट रूप से स्केल जोड़ना :: trans_new केवल नई त्रुटियों में परिणाम, स्केल फ़ंक्शन को अपडेट किया गया प्रतीत होता है :( – Richard

+2

@ रिचर्ड मैंने अभी इसे चेक किया है और यह काम करता है, लेकिन 'स्केल' पैकेज खोज पथ ('लाइब्रेरी (" स्केल ") से जुड़ा होना चाहिए।) यह उत्तर में स्पष्ट नहीं है (और शायद यह आवश्यक नहीं हो सकता है समय) अद्यतन। –

+0

यह आसान हैह ?! बहुत बहुत धन्यवाद !! – Richard

संबंधित मुद्दे