2010-10-05 29 views
15

मेरे पास डेटा है जो ज्यादातर एक छोटी सी सीमा (1-10) में केंद्रित है लेकिन इसमें बड़ी संख्या में अंक (10%) हैं (10-1000) हैं। मैं इस डेटा के लिए हिस्टोग्राम प्लॉट करना चाहता हूं जो (1-10) पर ध्यान केंद्रित करेगा लेकिन यह (10-1000) डेटा भी दिखाएगा। वें हिस्टोग्राम के लिए लॉग-स्केल की तरह कुछ।मैं आर का उपयोग कर एक लंबी पूंछ डेटा के हिस्टोग्राम कैसे प्लॉट कर सकता हूं?

हाँ, मुझे पता है इसका मतलब यह है कि सभी डिब्बे

एक साधारण hist(x) देता alt text जबकि hist(x,breaks=c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,3,4,5,7.5,10,15,20,50,100,200,500,1000,10000))) देता alt text

जो में से कोई भी है जो मैं चाहता बराबर आकार के हैं।

अद्यतन यहाँ जवाब निम्नलिखित मैं अब कुछ है जो लगभग ठीक है कि मैं क्या चाहता हूँ (मैं बार-हिस्टोग्राम के बजाय एक सतत साजिश साथ चला गया) का उत्पादन:

breaks <- c(0,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,4,8) 
ggplot(t,aes(x)) + geom_histogram(colour="darkblue", size=1, fill="blue") + scale_x_log10('true size/predicted size', breaks = breaks, labels = breaks)![alt text][3] 

alt text केवल समस्या यह है कि मैं पैमाने और वास्तविक सलाखों के बीच मिलान करना चाहता हूं। ऐसा करने के लिए दो विकल्प हैं: कोई बस प्लॉट किए गए सलाखों (कैसे?) के वास्तविक मार्जिन का उपयोग करता है, फिर 1.1754,1.2 9 85 आदि जैसे "बदसूरत" एक्स-अक्ष लेबल प्राप्त करें। दूसरा, जिसे मैं पसंद करता हूं, वास्तविक को नियंत्रित करना है डिब्बे मार्जिन का इस्तेमाल किया जाता है ताकि वे ब्रेक से मेल खा सकें।

+0

@Marek मेरे सवाल एक्स-अक्ष (या समान) लॉग करने के लिए, मान (y-axis) –

+0

@ डेविड मेरा बुरा नहीं है। रोलबैक;) – Marek

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/1245273/histogram-with-logarithmic-scale –

उत्तर

7

ggplot2 का उपयोग करना सबसे आसान विकल्प की तरह लगता है।आप अपने कुल्हाड़ियों और अपने टूटता है पर अधिक नियंत्रण चाहते हैं, तो आप निम्नलिखित की तरह कुछ कर सकते हैं:

संपादित करें: नया कोड

x <- c(rexp(1000,0.5)+0.5,rexp(100,0.5)*100) 

breaks<- c(0,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,10000) 
major <- c(0.1,1,10,100,1000,10000) 


H <- hist(log10(x),plot=F) 


plot(H$mids,H$counts,type="n", 
     xaxt="n", 
     xlab="X",ylab="Counts", 
     main="Histogram of X", 
     bg="lightgrey" 
) 
abline(v=log10(breaks),col="lightgrey",lty=2) 
abline(v=log10(major),col="lightgrey") 
abline(h=pretty(H$counts),col="lightgrey") 
plot(H,add=T,freq=T,col="blue") 
#Position of ticks 
at <- log10(breaks) 

#Creation X axis 
axis(1,at=at,labels=10^at) 

प्रदान की इस रूप में पास के रूप में मैं ggplot2 के लिए मिल सकता है। पृष्ठभूमि ग्रे डालना वह सीधा नहीं है, लेकिन यदि आप अपनी साजिश स्क्रीन के आकार के साथ एक आयताकार परिभाषित करते हैं और पृष्ठभूमि को ग्रे के रूप में डालते हैं तो यह करने योग्य नहीं है।

मेरे द्वारा उपयोग किए जाने वाले सभी कार्यों की जांच करें, और ?par भी देखें। यह आपको अपने ग्राफ बनाने की अनुमति देगा। उम्मीद है की यह मदद करेगा।

alt text

+0

ब्रेक परिभाषित करता है कि आपने टिक और लेबल कहां रखा है, प्रमुख परिभाषित करता है कि आपने प्रमुख लंबवत रेखाएं कहां रखी हैं। कुछ अतिरिक्त कोड के साथ, आप जहां चाहें टिक और लाइन जोड़ सकते हैं। अतिरिक्त कमांड अक्ष() लेबल के साथ = NA क्या मुझे लगता है कि चाल है। –

+0

+1 सभी मदद के लिए जोरीस धन्यवाद! –

9

बेस ग्राफ़िक्स के साथ ggplot के साथ लॉग स्केल हिस्टोग्राम आसान हैं। आप आधार ग्राफिक्स के लिए बेताब हैं, तो जैसे

library(ggplot2) 
dfr <- data.frame(x = rlnorm(100, sdlog = 3)) 
ggplot(dfr, aes(x)) + geom_histogram() + scale_x_log10() 

कुछ प्रयास करें, आप, कुल्हाड़ियों के बिना एक लॉग पैमाने पर हिस्टोग्राम साजिश तो मैन्युअल कुल्हाड़ियों बाद में जोड़ने की जरूरत है।

आप कोई लॉग के साथ डेटा प्लॉट हैं:

h <- hist(log10(dfr$x), axes = FALSE) 
Axis(side = 2) 
Axis(at = h$breaks, labels = 10^h$breaks, side = 1) 

पूर्णता के लिए, जाली समाधान

library(lattice) 
histogram(~x, dfr, scales = list(x = list(log = TRUE))) 

क्यों लॉग मान आधार मामले में की जरूरत है की एक विवरण होगा -transformation, तो अधिकांश डेटा बाईं ओर सलाखों में clumped हैं।

hist(dfr$x) 

hist समारोह log तर्क पर ध्यान नहीं देता (क्योंकि यह टूट जाता है की गणना के साथ हस्तक्षेप), तो यह काम नहीं करता।

hist(dfr$x, log = "y") 

यह भी नहीं करता है।

par(xlog = TRUE) 
hist(dfr$x) 

इसका मतलब है कि हमें साजिश खींचने से पहले डेटा को ट्रांसफॉर्म करना होगा।

hist(log10(dfr$x)) 

दुर्भाग्यवश, यह धुरी को गड़बड़ कर देता है, जो हमें ऊपर काम करने के लिए लाता है।

+0

जैसा कि जोरिस का उल्लेख है, बेस केस सेटिंग में 'xaxt = "n" 'अक्ष = FALSE' से क्लीनर है, क्योंकि आपको मैन्युअल रूप से मैन्युअल रूप से बनाने की आवश्यकता नहीं है y axis। –

+0

मुझे आधार ग्राफिक्स उदाहरण नहीं समझा जाता है - क्या आप मानों का लॉग ('log10 (dfr $ x) ') लेते हैं? क्यों? –

+0

भी, कृपया पुनः अपडेट करें। आपका अच्छा ggplot2 समाधान (+1) –

1

एक गतिशील ग्राफ भी इस साजिश में मदद मिलेगी। Rstudio से manipulate पैकेज का प्रयोग करें एक गतिशील हिस्टोग्राम लेकर करना है:

library(manipulate) 
data_distribution <- table(data) 
manipulate(barplot(data_dist[x:y]), x = slider(1,length(data_dist)), y = slider(10, length(data_dist))) 

तो फिर तुम स्लाइडर का उपयोग करने के लिए इस तरह एक गतिशील चयनित श्रेणी में विशेष रूप से वितरण को देखने के लिए सक्षम हो जाएगा: enter image description here

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

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