मैं प्लॉट की इस शैली को पुन: पेश करने का प्रयास कर रहा हूं ( बायेसियन अनुक्रमिक विश्लेषण), लेकिन मैं y अक्ष को सही तरीके से प्राप्त करने का प्रबंधन नहीं कर सकता। यह कुछ सरल उदाहरण डेटा है:
library(ggplot2)
testdata <- data.frame(logbf=c(1/1000,1/300,1/100,1/30,1/10,1/3,1,3,10,30,100,300,1000),n=1:13)
ggplot(testdata,aes(n,logbf)) + geom_line()
लक्ष्य इसे एक सीधी रेखा के रूप में प्लॉट करने के लिए प्राप्त करना है। ऐसा करने के लिए, मुझे y-अक्ष को 1 से 3, 3 से 10, आदि तक के 'खंडों' में विभाजित करने की आवश्यकता है। मैंने सोचा कि इसे scale_y_continuous(trans=X)
का उपयोग करके कार्यान्वित किया जा सकता है जहां X
एक है कस्टम नॉनलाइनियर स्केल, जैसा किया गया यहां।
समस्या यह है कि मुझे स्केलिंग एल्गोरिदम सही नहीं मिल रहा है। एक उदाहरण के रूप में मूल्य 38
का उपयोग करते हुए, मैंने सबसे कम मिलान वाले खंड विराम (30
) को खोजने के बारे में सोचा, और प्रत्येक मान को खंड संख्या (जैसे 3
का प्रतिनिधित्व करने वाले पूर्णांक भाग में विघटित करना, गिनती करना -5 से 5 तक के खंड और अगले खंड (8/(100-30) = 0.1143
) की दूरी का प्रतिनिधित्व करने वाला एक भिन्नात्मक भाग, जिसके परिणामस्वरूप 3.1143
का स्केल किया गया मान होता है।
मुझे नहीं पता कि यह एल्गोरिथम सही है या नहीं, लेकिन जब मैंने इसे कोड करने की कोशिश की तो मुझे जो परिणाम मिले, वे उतने नहीं थे। बड़ा सवाल यह है कि क्या इसे हासिल करने का कोई आसान तरीका नहीं है?
1 उत्तर
मूल उदाहरण मेरे लिए एक लॉग स्केल की तरह दिखता है, जिसमें 30 और 100 (x3.33) की तुलना में 10 और 30 (x3) के बीच की छोटी दूरी है। इसे scale_y_log10
(या scale_y_continuous(trans = "log10")
का उपयोग करके और फिर उन ब्रेक के लिए कस्टम ब्रेक और लेबल निर्दिष्ट करके दोहराया जा सकता है:
library(ggplot2)
testdata <- data.frame(logbf=c(1/1000,1/300,1/100,1/30,1/10,1/3,1,3,10,30,100,300,1000),n=1:13)
break_labels <- c("1/1000","1/300","1/100","1/30",
"1/10","1/3","1","3","10",
"30","100","300","1000")
ggplot(testdata,aes(n,logbf)) + geom_line() +
scale_y_log10(breaks = testdata$logbf,
labels = break_labels)