base::plot -- 我能获取绘图的纵横比吗?

5

我知道在绘图时可以指定宽高比,例如:plot(x,y,asp=5)。是否有办法在允许自动缩放后(如plot(x,y))检索宽高比? 我问的原因是因为我在使用text(x,y,'mystring',srt=local_slope)时遇到了问题,其中我根据基础曲线和感兴趣的x值计算出local_slope。麻烦的是,如果asp!=1,这将使文本旋转的角度与我的绘制数据集的显示斜率不同。示例:

x<- -10:10
y<- x^2
plot(x,y,t='l',asp=0.1) 
# the slope at x=1 is 2 but the default plot aspect ratio is far from 1:1
text(1,1,'foo',srt= 180/pi*atan(2) )  #ugly-looking
text(-1,1,'bar',srt= (180/pi*atan(2/10))) #better
1个回答

8
x<- -10:10
y<- x^2
plot(x,y,t='l',asp=0.1) 
### the slope at x=1 is 2 but the default plot aspect ratio is far from 1:1
text(1,1,'foo',srt= 180/pi*atan(2) )  #ugly-looking
text(-1,1,'bar',srt= (180/pi*atan(2/10))) #better

获取绘图区域的宽度和高度(单位为英寸)...

ff <- par("pin")
ff[2]/ff[1]  ## 1.00299

现在请手动调整图表大小...

ff <- par("pin")
ff[2]/ff[1]  ## 0.38

您还可以使用par("usr")来以用户单位解决纵横比问题,但我尚未找到完全正确的比例集合...MASS::eqscplot的内部结构可能也很有启发性。


谢谢。我可以生成 myasp <-ff[2]/ff[1]*diff(range(y))/diff(range(x))。// 我怀疑一些高级绘图包已经处理了这个问题;我还没有到那一步 :-) - Carl Witthoft
1
@CarlWitthoft -- range(y)range(x) 不一定给出 y 轴和 x 轴所覆盖的所有值。例如,当 par(xaxs="r") 时,它们不会给出完整的范围。因此,最好执行相当于 myasp <- with(par(), (pin[2]/pin[1])/(diff(usr[3:4])/diff(usr[1:2]))) 的操作,以确保安全。 - Josh O'Brien
@JoshO'Brien 谢谢,我会更加小心我的计算。 - Carl Witthoft

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