获取用户坐标中的边缘线位置 (mgp)
Get margin line locations (mgp) in user coordinates
我正在尝试做一些非常规的绘图标记,并且想要一种将 mtext
和 axis
中的 line
参数转换为用户坐标的方法。
换句话说,我想将 par()$mgp
中的值转换为用户坐标。
这说明了问题:
setup_plot <- function() {
par(mar = c(2, 10, 2, 2), oma = rep(2, 4))
plot.new()
plot.window(xlim = c(0, 1), ylim = c(0, 1))
box(which = "plot", lwd = 2, col = "gray40")
box(which = "figure", lwd = 2, col = "darkred")
box(which = "outer", lwd = 2, col = "darkgreen")
text(x = 0.5, y = 0.5,
labels = "Plot Region",
col = "gray40", font = 2)
mtext(side = 3, text = "Figure region", line = 0.5, col = "darkred", font = 2)
mtext(side = 3, text = "Device region", line = 2.5, col = "darkgreen", font = 2)
for (i in 0:9) {
mtext(side = 2, col = "darkred", text = paste0("Line", i), line = i)
}
}
我尝试了两种不同的方法。
## Try one approach where a line is the string height of "M"
setup_plot()
xline = strheight("M", units = "user")
abline(v = par()$usr[1] - 0:9*xline,
xpd = TRUE, lty = "dashed", col = "gray40")
## Try a second approach defining a line using par()$mai & par()$mar
setup_plot()
xline = abs(grconvertX(unique(par()$mai/par()$mar), "inches", "user"))
abline(v = par()$usr[1] - 0:9*xline,
xpd = TRUE, lty = "dashed", col = "gray40")
如何获取用户坐标中的线位置?
注意: 此处的数字为 4 英寸 x 6 英寸。更改输出大小会更改线条的绘制方式——这对我来说也没有意义。
以下应该可以解决问题:
setup_plot()
abline(v=par('usr')[1] - (0:9) *
diff(grconvertX(0:1, 'inches', 'user')) *
par('cin')[2] * par('cex') * par('lheight'),
xpd=TRUE, lty=2)
par('cin')[2] * par('cex') * par('lheight')
returns 以英寸为单位的当前行高,我们通过乘以 diff(grconvertX(0:1, 'inches', 'user'))
将其转换为用户坐标,用户坐标中的一英寸长度(水平方向,在此case - 如果对用户坐标中一行的垂直高度感兴趣,我们将使用 diff(grconvertY(0:1, 'inches', 'user'))
).
为了方便起见,可以将其包装成一个函数,如下所示:
line2user <- function(line, side) {
lh <- par('cin')[2] * par('cex') * par('lheight')
x_off <- diff(grconvertX(0:1, 'inches', 'user'))
y_off <- diff(grconvertY(0:1, 'inches', 'user'))
switch(side,
`1` = par('usr')[3] - line * y_off * lh,
`2` = par('usr')[1] - line * x_off * lh,
`3` = par('usr')[4] + line * y_off * lh,
`4` = par('usr')[2] + line * x_off * lh,
stop("side must be 1, 2, 3, or 4", call.=FALSE))
}
setup_plot()
abline(v=line2user(line=0:9, side=2), xpd=TRUE, lty=2)
编辑:该函数的更新版本可用 。
我正在尝试做一些非常规的绘图标记,并且想要一种将 mtext
和 axis
中的 line
参数转换为用户坐标的方法。
换句话说,我想将 par()$mgp
中的值转换为用户坐标。
这说明了问题:
setup_plot <- function() {
par(mar = c(2, 10, 2, 2), oma = rep(2, 4))
plot.new()
plot.window(xlim = c(0, 1), ylim = c(0, 1))
box(which = "plot", lwd = 2, col = "gray40")
box(which = "figure", lwd = 2, col = "darkred")
box(which = "outer", lwd = 2, col = "darkgreen")
text(x = 0.5, y = 0.5,
labels = "Plot Region",
col = "gray40", font = 2)
mtext(side = 3, text = "Figure region", line = 0.5, col = "darkred", font = 2)
mtext(side = 3, text = "Device region", line = 2.5, col = "darkgreen", font = 2)
for (i in 0:9) {
mtext(side = 2, col = "darkred", text = paste0("Line", i), line = i)
}
}
我尝试了两种不同的方法。
## Try one approach where a line is the string height of "M"
setup_plot()
xline = strheight("M", units = "user")
abline(v = par()$usr[1] - 0:9*xline,
xpd = TRUE, lty = "dashed", col = "gray40")
## Try a second approach defining a line using par()$mai & par()$mar
setup_plot()
xline = abs(grconvertX(unique(par()$mai/par()$mar), "inches", "user"))
abline(v = par()$usr[1] - 0:9*xline,
xpd = TRUE, lty = "dashed", col = "gray40")
如何获取用户坐标中的线位置?
注意: 此处的数字为 4 英寸 x 6 英寸。更改输出大小会更改线条的绘制方式——这对我来说也没有意义。
以下应该可以解决问题:
setup_plot()
abline(v=par('usr')[1] - (0:9) *
diff(grconvertX(0:1, 'inches', 'user')) *
par('cin')[2] * par('cex') * par('lheight'),
xpd=TRUE, lty=2)
par('cin')[2] * par('cex') * par('lheight')
returns 以英寸为单位的当前行高,我们通过乘以 diff(grconvertX(0:1, 'inches', 'user'))
将其转换为用户坐标,用户坐标中的一英寸长度(水平方向,在此case - 如果对用户坐标中一行的垂直高度感兴趣,我们将使用 diff(grconvertY(0:1, 'inches', 'user'))
).
为了方便起见,可以将其包装成一个函数,如下所示:
line2user <- function(line, side) {
lh <- par('cin')[2] * par('cex') * par('lheight')
x_off <- diff(grconvertX(0:1, 'inches', 'user'))
y_off <- diff(grconvertY(0:1, 'inches', 'user'))
switch(side,
`1` = par('usr')[3] - line * y_off * lh,
`2` = par('usr')[1] - line * x_off * lh,
`3` = par('usr')[4] + line * y_off * lh,
`4` = par('usr')[2] + line * x_off * lh,
stop("side must be 1, 2, 3, or 4", call.=FALSE))
}
setup_plot()
abline(v=line2user(line=0:9, side=2), xpd=TRUE, lty=2)
编辑:该函数的更新版本可用