如何使用bpDir包实现两幅CircularBoxplot并排展示?
问题分析与解决办法
问题根源
bpDir包的CircularBoxplot函数内部大概率包含了重置绘图参数的代码(比如直接调用par()恢复默认设置,或者用dev.new()新建绘图设备),这会直接冲掉你提前设置的par(mfrow = c(1,2))布局,导致第二幅图直接覆盖第一幅。
可行解决办法
方法1:用layout()替代par(mfrow)
layout()的布局控制逻辑更独立,不容易被函数内部的参数修改干扰,代码示例:
library(bpDir) require(circular) require(plotrix) data(fisherB12c) # 设置1行2列的布局 layout(matrix(1:2, nrow = 1)) # 绘制第一幅环形箱线图 CircularBoxplot(fisherB12c, template = "geographics") # 绘制第二幅(替换成你需要的数据集或参数即可) CircularBoxplot(fisherB12c, template = "geographics") # 恢复默认布局 layout(1)
方法2:手动指定绘图区域
通过par(fig)手动定义每个图的位置范围,彻底绕开函数内部的布局干扰:
library(bpDir) require(circular) require(plotrix) data(fisherB12c) # 绘制左半部分的图 par(fig = c(0, 0.5, 0, 1), new = FALSE) CircularBoxplot(fisherB12c, template = "geographics") # 绘制右半部分的图,new=TRUE表示在当前设备上叠加绘图 par(fig = c(0.5, 1, 0, 1), new = TRUE) CircularBoxplot(fisherB12c, template = "geographics") # 恢复默认绘图区域设置 par(fig = c(0, 1, 0, 1), new = FALSE)
方法3:修改函数内部代码(谨慎操作)
在R控制台输入CircularBoxplot查看函数源码,如果发现里面有par()重置或者dev.new()的语句,可以复制源码到本地,注释掉这些干扰布局的代码,然后重新定义这个函数。比如:
# 复制原函数代码,注释掉干扰布局的行 my_CircularBoxplot <- function(...) { # 原函数代码,去掉par()重置或dev.new()的语句 # 比如如果有par(mfrow=c(1,1))这类行,直接注释掉 # ... 原函数其他代码 ... } # 用修改后的函数绘图 par(mfrow = c(1,2)) my_CircularBoxplot(fisherB12c, template="geographics") my_CircularBoxplot(fisherB12c, template="geographics")
内容的提问来源于stack exchange,提问作者user3236841
相关产品推荐
相关产品推荐

