asp
将覆盖xlim
和ylim
设置,如果您查看plot
的帮助文档,则asp
在plot.window
的帮助文档中进行了讨论:
如果asp
是有限正值,则设置窗口使得x方向上的一个数据单位的长度等于asp
* y方向上的一个数据单位。
请注意,在这种情况下,par("usr")
不再由par("xaxs")
等决定,而是由asp
和设备的纵横比决定。(运行下面的示例后,查看交互式调整绘图设备会发生什么!)
特殊情况asp == 1
生成距离屏幕上的点之间的准确距离的图。使用asp > 1
的值可以在使用纬度和经度时生成更准确的地图。
如@mr.joshuagordon所指出,您可以使用pdf
(或者如果您想要位图输出则使用png
或jpeg
)函数,并调整尺寸以获得所需的纵横比,同时从plot
中删除asp
参数,以便您可以设置xlim
和ylim
值。
另一个选择是切换到ggplot2
,它使得轴限制和纵横比分别设置变得容易:
library(ggplot2)
dat = data.frame(x=c(2,30,50), y=c(10, 60, 90))
ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(limits=c(0,70)) +
scale_y_continuous(limits=c(0,100)) +
coord_fixed(ratio=1)
ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(limits=c(0,70)) +
scale_y_continuous(limits=c(0,100)) +
coord_fixed(ratio=70/100)
更新:以下是如何在基础图形中独立控制xlim
,ylim
和纵横比的方法: 使用图形参数pin
而不是asp
来设置绘图区域的物理尺寸。此设置不会影响xlim
和ylim
的名义值,但会改变1个x单位和1个y单位的物理距离度量。以下是一些示例:
示例1:我们将在一个PDF页面上创建两个面板,每个面板具有不同的纵横比:
pdf("test.pdf", width=12, height=6)
par(mfrow=c(1,2))
par(pin=c(5,5))
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n",main='par(pin=c(5,5)')
par(pin=c(0.7*5,5))
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n",main='par(pin=c(5,0.7*5)')
dev.off()
示例2:展示如果将pin
设置为大于图形设备的大小,您将会收到一个错误。我们将使用默认设备(在我的情况下为RStudioGD
)。
par(pin=c(10, 10))
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n",main='par(pin=c(5,4)')
par("din")
par(pin=par("din")-0.2)
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n",main='par(pin=c(5,4)')
par(pin=par("din") + 0.01)
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n")
> Error in plot.new() : plot region too large
示例3:如果您超出了pdf
(或png
等)设备的大小限制,将会发生相同的错误:
pdf("test.pdf", 5,5)
par(pin=c(5,5)-0.2)
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n")
dev.off()
pdf("test.pdf", 5,5)
par(pin=c(5,5)+0.01)
plot(0, 0, xlim = c(0, 70), ylim = c(0, 100), xlab = "", ylab = "",
type = "n")
dev.off()
ggplot2
。我也曾经避开它一段时间,因为学习新的图形思维方式似乎需要付出很多努力。但实际上并不需要花费太长时间,现在我几乎不再使用基础图形了。 - eipi10ggplot2
也比较慢,但是除非你处理的数据集非常大(至少在我的经验中超过一百万行——好吧,也许一百万行不再算是很大了),否则差异是无法察觉的。但如果这是个问题,只需使用dplyr
(或您喜欢的R
分割-应用-合并策略)来进行聚合和汇总,然后将摘要数据提供给ggplot2
。此外,ggplot2的创建者Hadley Wickham一直在研究快速绘制大型数据集的方法,因此我预计随着时间的推移,任何速度差异都会减少。 - eipi10