我有一个带有两个对数轴的图。我想在情节的某个位置添加一个圆圈。我尝试使用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)
如何在记录日志中添加圆圈?
答案 0 :(得分: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)
答案 1 :(得分: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")
答案 2 :(得分: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
。为border
,col
,lty
和/或lwd
传递适当的值,以隐藏函数本身绘制的多边形。
第一个版本对我来说听起来更容易。 只需将 编辑:这些转换是稍微有点错误,请看Josh对正确答案的答案。+ x
替换为* x
,y
循环内的for
相同,即可完成。同样,对于第二个版本,您减去x
,然后乘以x
每个坐标,y
相同。