2012-06-05 22 views
5

मुझे 1e-10 से छोटी संख्याओं के लिए वाई-स्केलिंग के साथ कोई समस्या है: वे सभी एक ही क्षैतिज रेखा पर दिखाई देते हैं।वाई अक्ष स्केलिंग समस्या छोटी संख्या

file <- structure(list(I = c(-7.254574e-11, -5.649333e-11, -5.015416e-11, 
-4.228137e-11, -3.287486e-11, -2.714915e-11, -2.203692e-11, -1.784489e-11, 
-1.150574e-11, -1.058553e-11, -6.189018e-12, -3.735149e-12, -2.303724e-12, 
6.610914e-13, 1.274374e-12, -3.610768e-13, 5.465134e-12, 6.691699e-12, 
8.020478e-12, 1.139353e-11, 1.537988e-11, 1.926399e-11, 2.130825e-11, 
2.45791e-11, 3.204071e-11, 3.582262e-11, 4.287535e-11, 4.624839e-11, 
5.16657e-11, 6.035387e-11), V = c(-2, -1.867, -1.733, -1.6, -1.467, 
-1.333, -1.2, -1.067, -0.933, -0.8, -0.667, -0.533, -0.4, -0.267, 
-0.133, 0, 0.133, 0.267, 0.4, 0.533, 0.667, 0.8, 0.933, 1.067, 
1.2, 1.333, 1.467, 1.6, 1.733, 1.867)), .Names = c("I", "V"), class = "data.frame", row.names = c(NA, 
-30L)) 

plot(file$V,file$I) 

gg <- ggplot(file,aes(x = V,y=I)) 
print(gg + geom_point()) 

आप देख सकते हैं, आधार भूखंड समारोह का उपयोग कर अंक सही ढंग से प्रदर्शित कर रहे हैं जबकि ggplot2 का उपयोग कर वे एक क्षैतिज रेखा पर प्रदर्शित होते हैं:

यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है।

मैंने मई 2011 में मेलिंग सूची पर एक समान पोस्ट देखा, जिसके लिए हैडली ने जवाब दिया कि यह ggplot2 के विकास संस्करण के साथ काम करता है। हालांकि, नीचे वर्णित आर संस्करण का उपयोग करके मुझे अभी भी त्रुटि मिलती है।

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: i686-pc-linux-gnu (32-bit) 

locale: 
[1] LC_CTYPE=fr_FR.UTF-8  LC_NUMERIC=C    LC_TIME=fr_FR.UTF-8  
[4] LC_COLLATE=fr_FR.UTF-8  LC_MONETARY=fr_FR.UTF-8 LC_MESSAGES=fr_FR.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     LC_ADDRESS=C    
[10] LC_TELEPHONE=C    LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] tikzDevice_0.6.2 filehash_2.2-1 scales_0.2.0  plyr_1.7.1  reshape2_1.2.1 
[6] ggplot2_0.9.0 

loaded via a namespace (and not attached): 
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2  grid_2.15.0  MASS_7.3-18  
[6] memoise_0.1  munsell_0.3  proto_0.3-9.2  RColorBrewer_1.0-5 stringr_0.6  
[11] tools_2.15.0 

किसी के पास कोई सुराग है?

अग्रिम धन्यवाद! थिबॉड रूएल

+0

+1 एक त्वरित परीक्षण मेरे सिस्टम पर इस व्यवहार की पुष्टि करता है (ggplot2 0.9.1)। शायद एक उलटा हुआ था, या? –

+0

@ बेनबॉल्कर मैंने ब्रायन से इस संबंध में पूछा, [this] (http://stackoverflow.com/q/10808056/324364) पिछले प्रश्न से कनेक्शन दिया। – joran

+0

@ जोरन हां ऐसा लगता है कि दो पदों को विलय किया जा सकता है। मुझे अपने शोध के साथ नहीं मिला के लिए खेद है। –

उत्तर

3

ब्रायन डिग्स ने a related post that @joran pointed to above के जवाब में टिप्पणी की, समस्या scales::zero_range() के कारण होने वाली समस्या है। यह जांचने के लिए all.equal() का उपयोग करता है कि क्या सबसे छोटा और सबसे बड़ा वाई-मान tolerance = .Machine$double.eps^0.5 = 1.490116e-08 एक दूसरे के भीतर है; यदि वे हैं, तो डेटा आपके उदाहरण में उपयोग किए गए "शून्य पैमाने" के साथ प्लॉट किया गया है।

अस्थायी फ़िक्स के रूप में, आप के अपमानजनक बिट को हटाने के लिए fixInNamespace() का उपयोग कर सकते हैं।

function (x) 
{ 
    length(x) == 1 || isTRUE(all.equal(x[1] - x[2], 0)) 
} 

इस एक साथ (संपादित संस्करण को बचाने के लिए सुनिश्चित करने के):

function (x) 
{ 
    length(x) == 1 
} 

कोड आप

library(scales) ## (The scales package needs to be on your search path) 
fixInNamespace("zero_range", pos="package:scales") 

fixInNamespace() द्वारा शुरू संपादक में, zero_range() की इस परिभाषा को बदलने आपूर्ति की जाती है तो ठीक है:

enter image description here

+0

आप मानते हैं कि 'all.equal' में' सहिष्णुता 'तर्क को भी समायोजित कर सकते हैं। – joran

+0

@joran - कोई विचार क्या बेहतर मूल्य होगा? मुझे नहीं पता कि हैडली इस कोड के साथ सुरक्षा करने की कोशिश कर रहा है, इसलिए यह नहीं पता कि यह कितना कम सुरक्षित है ... (तो निश्चित रूप से मैं गया और सभी को एक साथ सुरक्षा हटा दी;) –

+0

अच्छा, ' zero_range' आमतौर पर न्यूनतम/अधिकतम के साथ एक वेक्टर पास किया जाता है, इसलिए आप चाहते हैं कि जब वे समान हों तो _some_ जांचें। शायद बस जांचें कि 'x [1] == x [2] '? मुझे लगता है कि यहां फ्लोटिंग पॉइंट एज केस हैं जो मुझे समझ में नहीं आता है। – joran