2012-07-25 80 views
8

我想達到以下結果:整數變量的氣泡圖,其中最大氣泡的直徑爲1(在x或y軸刻度上)?

  1. 重新調節氣泡的大小,使得所述最大氣泡具有直徑爲1的 (上取具有在x 軸和y軸的多個壓縮級)。
  2. 重新調節氣泡的大小,使得最小氣泡的直徑爲1毫米
  3. 具有與第一和最後一個點的最小非零 頻率和最大頻率的圖例。

我已經能夠做的最好的如下,但我需要一個更通用的解決方案,其中計算maxSize的值而不是硬編碼。如果我是在傳統的R圖中做的話,我會使用par(「pin」)來計算出繪圖區域的大小並向後工作,但我無法弄清楚如何使用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

你是如何在你的榜樣到達 「20」 爲'maxSize'? – A5C1D2H2I1M1N2O1R2T1 2012-08-16 08:02:09

回答

7

當沒有ggplot,格子或其他的高級包,似乎沒有做微調小時的工作中,我總是回覆到基本圖形。下面的代碼爲你提供了你想要的,並且之後我有另一個基於我如何繪製它的例子。

但請注意,我已將最大半徑設置爲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