8

次の成果を達成したいと考えています。

  1. 最大のバブルの直径が 1 になるように、バブルのサイズを再スケーリングします (x 軸と y 軸のスケールがより圧縮されている方)。
  2. 最小のバブルの直径が 1 mm になるように、バブルのサイズを変更します。
  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) 

これまでの様子は次のとおりです。 ここに画像の説明を入力

4

1 に答える 1

7

ggplot、lattice、またはその他の高レベルのパッケージが何時間も微調整せずに仕事をしているように見えるとき、私は常にベースグラフィックスに戻ります。次のコードはあなたが望むものを取得し、その後、私がそれをどのようにプロットしたかに基づいた別の例があります。

ただし、最大半径size.range/2を1 cmに設定しましたが、代わりに直径を取得するために分割することに注意してください。私はちょうど半径が私にもっと良いプロットを与えたと思った、そしてあなたはおそらくとにかく物事を調整したいと思うだろう。

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)

プロットの提案1

今私の提案に従います。最大の円の半径は1cmで、円の面積は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"))

プロットの提案2

于 2012-08-16T11:44:53.957 に答える