2012-07-25 13 views
8

मैं निम्नलिखित परिणाम प्राप्त करना चाहते हैं:पूर्णांक चर के लिए बबल चार्ट जहां सबसे बड़ा बुलबुला व्यास 1 (एक्स या वाई धुरी पैमाने पर) है?

  1. सबसे बड़ा बुलबुला 1 के एक व्यास (जो भी पर एक्स और y अक्ष अधिक संकुचित पैमाने है) है ऐसा है कि बुलबुले के आकार rescale।
  2. छोटी से छोटी बुलबुले की 1 मिमी
  3. पहली और आखिरी अंक न्यूनतम गैर शून्य आवृत्ति और अधिकतम आवृत्ति के साथ एक पौराणिक कथा है एक व्यास है ऐसी है कि बुलबुले के आकार rescale।

सबसे अच्छा मैं ऐसा करने में सक्षम हूं, लेकिन मुझे एक सामान्य समाधान की आवश्यकता है जहां हार्ड साइज के मूल्य को हार्ड-कोड की तुलना में गणना की जाती है। यदि मैं इसे पारंपरिक आर प्लॉट्स में कर रहा था तो मैं साजिश क्षेत्र के आकार को काम करने के लिए बराबर ("पिन") का उपयोग करता हूं और पीछे की ओर काम करता हूं, लेकिन मैं यह नहीं समझ सकता कि ggplot2 के साथ इस जानकारी को कैसे पहुंचाया जाए। कोई सुझाव?

library(ggplot2) 
agData = data.frame(
    class=rep(1:7,3), 
    drv = rep(1:3,rep(7,3)), 
    freq = as.numeric(xtabs(~class+drv,data = mpg)) 
) 

agData = agData[agData$freq != 0,] 
rng = range(agData$freq) 
mn = rng[1] 
mx = rng[2] 
minimumArea = mx - mn 
maxSize = 20 
minSize = max(1,maxSize * sqrt(mn/mx)) 
qplot(class,drv,data = agData, size = freq) + theme_bw() + 
    scale_area(range = c(minSize,maxSize), 
      breaks = seq(mn,mx,minimumArea/4), limits = rng) 

यहाँ क्या यह अब तक की तरह लग रहा है: enter image description here

+0

आप अपने उदाहरण में 'maxSize' के लिए" 20 "पर आए? – A5C1D2H2I1M1N2O1R2T1

उत्तर

7

कोई ggplot, जाली या अन्य highlevel पैकेज मैं हमेशा आधार ग्राफिक्स पर वापस लौटने ट्यूनिंग के घंटे के बिना काम करने के लिए लगता है जब। निम्नलिखित कोड आपको प्राप्त करता है जो आप चाहते हैं, और इसके बाद मेरे पास एक और उदाहरण है कि मैं इसे कैसे प्लॉट करता हूं।

नोट तथापि है कि मैं अधिक से अधिक त्रिज्या 1 सेमी की स्थापना की है, लेकिन सिर्फ size.range/2 विभाजित बजाय व्यास प्राप्त करने के लिए। मैंने सोचा कि त्रिज्या ने मुझे अच्छे प्लॉट दिए हैं, और आप शायद वैसे भी चीजों को समायोजित करना चाहते हैं।

size.range <- c(.1, 1) # Min and max radius of circles, in cm 

# Calculate the relative radius of each circle 
radii <- sqrt(agData$freq) 
radii <- diff(size.range)*(radii - min(radii))/diff(range(radii)) + size.range[1] 

# Plot in two panels 
mar0 <- par("mar") 
layout(t(1:2), widths=c(4,1)) 

# Panel 1: The circles 
par(mar=c(mar0[1:3],.5)) 
symbols(agData$class, agData$drv, radii, inches=size.range[2]/cm(1), bg="black") 

# Panel 2: The legend 
par(mar=c(mar0[1],.5,mar0[3:4])) 
symbols(c(0,0), 1:2, size.range, xlim=c(-4, 4), ylim=c(-2,4), 
     inches=1/cm(1), bg="black", axes=FALSE, xlab="", ylab="") 
text(0, 3, "Freq") 
text(c(2,0), 1:2, range(agData$freq), col=c("black", "white")) 

# Reset par settings 
par(mar=mar0) 

Plot suggestion 1

अब मेरी सुझाव इस प्रकार है। सबसे बड़े सर्कल में 1 सेमी का त्रिज्या होता है और सर्कल का क्षेत्र agData$freq के समान होता है, बिना छोटे सर्कल के आकार को मजबूर किए। व्यक्तिगत रूप से मुझे लगता है कि यह पढ़ने के लिए आसान है (कोड और आंकड़ा दोनों) और अच्छा लगता है।

with(agData, symbols(class, drv, sqrt(freq), 
    inches=size.range[2]/cm(1), bg="black")) 
with(agData, text(class, drv, freq, col="white")) 

Plot suggestion 2

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