4

我有一个带有两个对数轴的图。我想在情节的某个位置添加一个圆圈。我尝试使用plotrix,但这没有提供“log-radius”选项。

# 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(). 对数坐标系会扭曲以线性刻度给出的圆的坐标;为了抵消这种情况,您只需对计算出的坐标进行取幂,正如我在## <-下面代码中标记的行中所做的那样:

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.circleplotrix我的系统上看起来像这样:

> 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结果。border为、collty/或传递适当的值lwd以隐藏由函数本身绘制的多边形。

第一个版本对我来说听起来更容易。只需将循环内的+ xa替换为* x相同的 for ,就完成了。等效地,对于第二个版本,您减去然后乘以每个坐标,对于.yforxxy 编辑:这些转换略有错误,请参阅 Josh 的正确答案。

于 2013-04-12T09:27:36.173 回答