4

2 つの対数軸を持つプロットがあります。プロットの特定の位置に円を追加したいと思います。を使用しようとしましplotrixたが、これは「対数半径」のオプションを提供しません。

# data to plot
x = 10^(-1 * c(5:0))
y = x ^-1.5

#install.packages("plotrix", dependencies=T)
# use require() within functions
library("plotrix")

plot (x, y, log="xy", type="o")
draw.circle(x=1e-2, y=1e2, radius=1e1, col=2)

対数プロットに円を追加するにはどうすればよいですか?

4

3 に答える 3

6

krlmlr が示唆するように、最も簡単な解決策は を少し変更することplotrix::draw.circle()です。log-log 座標系は、線形スケールで指定された円の座標を歪めます。## <-これに対抗するには、以下のコードで でマークされた行で行ったように、計算された座標を累乗する必要があります。

library("plotrix")

draw.circle.loglog <- 
function (x, y, radius, nv = 100, border = NULL, col = NA, lty = 1,
    lwd = 1)
{
    xylim <- par("usr")
    plotdim <- par("pin")
    ymult <- (xylim[4] - xylim[3])/(xylim[2] - xylim[1]) * plotdim[1]/plotdim[2]
    angle.inc <- 2 * pi/nv
    angles <- seq(0, 2 * pi - angle.inc, by = angle.inc)
    if (length(col) < length(radius))
        col <- rep(col, length.out = length(radius))
    for (circle in 1:length(radius)) {
        xv <- exp(cos(angles) * log(radius[circle])) * x[circle]         ## <-
        yv <- exp(sin(angles) * ymult * log(radius[circle])) * y[circle] ## <-
        polygon(xv, yv, border = border, col = col[circle], lty = lty,
            lwd = lwd)
    }
    invisible(list(x = xv, y = yv))
}

# Try it out 
x = 10^(-1 * c(5:0))
y = x ^-1.5

plot (x, y, log="xy", type="o")
draw.circle.loglog(x = c(1e-2, 1e-3, 1e-4), y = c(1e2, 1e6, 1e2),
                   radius = c(2,4,8), col = 1:3)

ここに画像の説明を入力

于 2013-04-13T07:50:19.683 に答える
5

回避策は、log10明示的に適用することです。

plot (log10(x), log10(y), type="o")
draw.circle(x=log10(1e-2), y=log10(1e2), radius=log10(1e1), col=2)

編集 (を使用symbols):

plot (x, y, log="xy", type="o",xlim=c(1e-5,1), ylim=c(1,1e8))
par(new=T)
symbols(x=1e-2, y=1e2, circles=1e1, xlim=c(1e-5,1), ylim=c(1,1e8), 
        xaxt='n', yaxt='n', ann=F, log="xy")
于 2013-04-10T09:10:57.833 に答える
3

パッケージの関数draw.circleは、plotrix私のシステムでは次のようになります。

> draw.circle
function (x, y, radius, nv = 100, border = NULL, col = NA, lty = 1, 
    lwd = 1) 
{
    xylim <- par("usr")
    plotdim <- par("pin")
    ymult <- (xylim[4] - xylim[3])/(xylim[2] - xylim[1]) * plotdim[1]/plotdim[2]
    angle.inc <- 2 * pi/nv
    angles <- seq(0, 2 * pi - angle.inc, by = angle.inc)
    if (length(col) < length(radius)) 
        col <- rep(col, length.out = length(radius))
    for (circle in 1:length(radius)) {
        xv <- cos(angles) * radius[circle] + x
        yv <- sin(angles) * radius[circle] * ymult + y
        polygon(xv, yv, border = border, col = col[circle], lty = lty, 
            lwd = lwd)
    }
    invisible(list(x = xv, y = yv))
}
<environment: namespace:plotrix>

ここで起こることは、基本的に、円が 100 個の頂点 (パラメーターnv) の多角形によって近似されることです。次のいずれかを実行できます。

  • draw.circle軸の対数変換を「元に戻す」ために必要な座標変換を行う独自のバージョンを作成します。

  • この関数は、プロットに使用される座標のリストを非表示で返します。(ベクトルを として渡すと、最後の円の座標のみが返されます。) それらの座標に変換を適用し、結果radiusを呼び出すことができる場合があります。関数自体によって描画された多角形を非表示にするには、 、、および/またはにpolygon適切な値を渡します。bordercolltylwd

私には最初のバージョンの方が簡単に聞こえます。をループ内で同じ for に+ x置き換える* xだけで完了です。同様に、2 番目のバージョンでは、 の場合と同じように、各座標を減算してから乗算します。yforxxy 編集:これらの変換は少し間違っています。正しい変換については Josh の回答を参照してください。

于 2013-04-12T09:27:36.173 に答える