R语言已调用plot()仍报plot.new has not been called yet错误排查
报错原因与排查方案
plot.new has not been called yet报错的本质是:调用points()、abline()这类base R低级绘图函数时,当前R会话中没有处于活跃状态的base R绘图帧。你认为已经执行过plot()生成了底图,但实际上那行代码并没有成功打开可被base R低级函数识别的活跃绘图设备。
常见触发场景
你提供的最小复现示例已经暴露了最高发的原因:
- 混用ggplot2与base R绘图语法
你写的plot(BOD, aes(x=Time, y=demand))中,aes()是ggplot2包的专用参数。如果当前环境加载了ggplot2,这行代码不会触发base R的绘图流程,只会生成一个未被渲染的ggplot对象:- ggplot基于grid绘图系统,和base R绘图系统完全独立,不会注册base R可识别的绘图帧
- 逐行运行时如果这行代码的返回值没有被自动打印,连ggplot的图都不会显示,后续调用base R的
abline()/points()必然报错
你最初的NMDS绘图遇到同类问题,大概率是加载的某个R包(比如vegan的ggplot扩展包)重写了metaMDS对象的plot方法,返回的是ggplot对象而非base R绘图,你看到的底图是ggplot渲染的,不支持base R低级函数操作。
- RStudio输出设置问题
如果你在R Markdown脚本中逐行运行代码,且开启了行内输出选项,plot生成的图会渲染在代码块旁的临时输出区域,不会打开全局持久的base R绘图设备,后续运行的低级函数找不到活跃绘图帧就会报错。 - 绘图设备被意外关闭
运行plot代码后,如果误执行了dev.off()、点击了Plots面板的清除按钮,或者运行了其他会重置绘图设备的代码,之前打开的绘图帧会被销毁,再调用低级函数也会报这个错。
解决方案
根据你用的绘图系统选对应方案即可:
如果你要用base R绘图(适配你原来写的points/abline逻辑)
- 不要在base R的
plot()函数里传入aes()参数,纯base R的绘图写法不要混ggplot语法。以BOD数据为例,正确写法是:# 纯base R绘图,不调用aes plot(demand ~ Time, data = BOD, main = "BOD数据示例") abline(lm(demand ~ Time, data = BOD)) # 此时运行不会报错 - 针对NMDS绘图,如果怀疑plot方法被其他包重写,可以显式调用vegan包的base R绘图方法:
soy.nmds <- metaMDS(species.hell.soy, distance = "bray", k = 2) # 强制调用vegan的base R版plot方法 vegan:::plot.metaMDS(soy.nmds, type = "none", main = paste("NMDS/Bray - Stress=", round(soy.nmds$stress, 3)), xlab = "NMDS1", ylab = "NMDS2") # 再调用points就可以正常添加元素 points(scores(soy.nmds, display = "sites", choices = c(1,2)), pch = 21, col = "black", bg = "steelblue", cex = 1.2) - 运行低级函数前可以执行
dev.cur()检查当前活跃设备,如果返回null device,说明没有可用的base R绘图帧,重新运行plot代码即可。如果是在Rmd中运行,把plot和后续低级绘图代码放在同一个代码块中执行,或关闭行内输出选项让绘图输出到全局Plots面板。
如果你实际想用ggplot2绘图
完全放弃base R的points()/abline()这类函数,改用ggplot2的图层语法,所有图层用+连接到同一个ggplot对象上,不要单独逐行运行低级绘图函数。以BOD数据为例:
library(ggplot2) # 用ggplot()初始化绘图,不要用base的plot混aes p <- ggplot(BOD, aes(x = Time, y = demand)) + geom_point() # 加线用geom_abline,不要用base R的abline p + geom_abline(slope = coef(lm(demand ~ Time, data=BOD))[2], intercept = coef(lm(demand ~ Time, data=BOD))[1])
内容的提问来源于stack exchange,提问作者Leah r-t
相关产品推荐
相关产品推荐

