2012-07-25 12 views
8

Iは、以下の結果を達成したい:最大バブルの直径が1(xまたはy軸スケール)の整数変数のバブルチャートですか?

  1. 最大泡1の 直径を有するような気泡の大きさを再スケーリングする(いずれのX 軸およびy軸のより圧縮スケールを有しています)。
  2. 最小の泡が1mm
  3. の直径を有するような気泡の大きさを再スケーリング最初と最後の点の最小の非ゼロ 周波数と最大周波数との伝説を持っています。

私ができることは次のとおりですが、私はmaxSizeの値がハードコードではなく計算されるより一般的な解決策が必要です。私が伝統的なRのプロットでそれをやっていたのであれば、プロ領域のサイズを調整して後方に作業するためにpar( "ピン")を使用しますが、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) 

は、それがこれまでのように見えるものです:なしggplot、格子または他の高レベルのパッケージは、私はいつもベースのグラフィックスに戻す微調整の時間なしで仕事をするようだ enter image description here

答えて

7

。次のコードは、あなたが望むものを得ることができます。その後、私はそれをどのようにプロットしたかに基づいた別の例があります。

ただし、最大の半径はに設定していますが、代わりに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

私の提案に従っています。最大円の半径は1cmであり、円の面積は最小円のサイズを強制することなくagData$freqに比例します。個人的には、これは読みやすく(コードと図形の両方)、見栄えが良いと思います。あなたはあなたの例では、 `maxSize`ための "20" に到着しましたか

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

関連する問題