在R的网格图形中保持纵横比

7

使用低级别的graphics包工具,绘制一个高度是宽度两倍以上的“十字形”矩形,我调用以下方法:

xlim <- c(0, 500)
ylim <- c(0, 1000)
plot.new()
plot.window(xlim, ylim, asp=1)
rect(xlim[1], ylim[1], xlim[2], ylim[2])
lines(c(xlim[1], xlim[2]), c(ylim[1], ylim[2]))
lines(c(xlim[1], xlim[2]), c(ylim[2], ylim[1]))
< p >这个图形有一个很好的特点:它保留了长宽比,因此如果我更改绘图窗口的大小,我会得到相同的高度与宽度比例。

我如何使用grid图形获得相同的效果?

2个回答

3

您应该创建一个使用正方形归一化父级坐标的视口,参见?unit

"snpc":(...) 这对于制作相对于视口比例但必须为正方形(或具有固定长宽比)的东西非常有用。

这是代码:

library('grid')
xlim <- c(0, 500)
ylim <- c(0, 1000)
grid.newpage() # like plot.new()
pushViewport(viewport( # like plot.window()
        x=0.5, y=0.5, # a centered viewport
        width=unit(min(1,diff(xlim)/diff(ylim)), "snpc"), # aspect ratio preserved
        height=unit(min(1,diff(ylim)/diff(xlim)), "snpc"),
        xscale=xlim, # cf. xlim
        yscale=ylim  # cf. ylim
))
# some drawings:
grid.rect(xlim[1], ylim[1], xlim[2], ylim[2], just=c(0, 0), default.units="native")
grid.lines(xlim, ylim, default.units="native")
grid.lines(xlim, rev(ylim), default.units="native")

grid.rect中的default.units参数强制绘图函数使用本地(xscale/yscale)视口坐标。当just=c(0, 0)时,xlim[1], ylim[1]表示矩形的左下角节点。


1
在基于 gridggplot2 中,您可以使用 coord_fixed() 来固定宽高比:
library(ggplot2)
ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point() + coord_fixed(ratio = 0.5)

这将修正比例,即使更改图形窗口的大小,比例也将保持不变。
我不确定这是否有帮助,因为您要求基于低级别的grid解决方案。但我认为这可能仍然有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接