You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言lapply批量绘制逐行风玫瑰图遇pin参数无效错误

解决climatol包rosavent函数使用par(mfrow)并排绘图的报错问题

我明白你遇到的麻烦了——想用par(mfrow=c(2,2))把4个风速分组的风玫瑰图并排展示,却碰到了invalid value specified for graphical parameter "pin"的错误,单独用windows()能画出图但没法实现排版。这其实是因为rosavent()函数默认会在绘图结束后重置绘图参数(也就是reset.par=TRUE),这会和你提前设置的mfrow布局冲突,导致参数恢复时出错。

下面给你两个可行的解决办法:

方法一:禁用rosavent的参数重置功能

这是最直接的方案,只需要在调用rosavent()时添加reset.par=FALSE参数,让函数保持你设置的mfrow布局,而不是恢复初始的绘图参数。修改后的代码如下:

require(climatol)
data(windfr)

# 设置2x2的绘图布局,同时调整边距让图更紧凑
par(mfrow=c(2,2), mar=c(2,2,3,1))  

# 获取所有行名
ii <- rownames(windfr)

# 逐行绘图,禁用参数重置
lapply(ii, function(i) {
  rosavent(windfr[i,,drop=FALSE],  # 更简洁的子集化方式,确保返回数据框
           5, 
           10, 
           ang = -3*pi/16, 
           main = i,
           reset.par = FALSE)  # 关键参数:阻止函数重置绘图参数
})

# 绘图完成后恢复初始的par设置(可选,避免影响后续绘图)
par(mfrow=c(1,1))

几个关键点:

  • windfr[i,,drop=FALSE]:确保子集化后仍然是数据框格式,避免单行数据变成向量导致rosavent报错
  • reset.par=FALSE:阻止函数在绘图后恢复原始的par参数,让mfrow的布局持续生效到所有图绘制完成
  • 提前设置mar参数:调整绘图边距,避免2x2布局里的图过于拥挤

方法二:使用gridGraphics将基础绘图转为grid对象,再用grid.arrange排版

如果你不想修改rosavent的默认行为,也可以借助gridGraphics包把每个基础绘图转换成grid对象,然后用gridExtra的grid.arrange来排版,这种方式更灵活,即使是基础绘图也能实现类似ggplot的排版效果:

require(climatol)
require(gridGraphics)
require(gridExtra)
data(windfr)

ii <- rownames(windfr)

# 生成每个风玫瑰图的grid对象
plot_list <- lapply(ii, function(i) {
  grid.echo({
    rosavent(windfr[i,,drop=FALSE],
             5, 
             10, 
             ang = -3*pi/16, 
             main = i)
  })
  grid.grab()
})

# 按2x2的布局展示所有图
grid.arrange(grobs=plot_list, ncol=2, nrow=2)

简单解释:

  • grid.echo():把基础绘图命令转换成grid系统的绘图指令
  • grid.grab():把当前的grid绘图内容保存为可排版的grob对象
  • grid.arrange():将多个grob对象按指定行列数组合展示

这两种方法都能解决你的问题,推荐第一种,更简洁高效,不需要额外加载包。

内容的提问来源于stack exchange,提问作者maycca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:50:17