R包beeswarm设do.plot=F时x坐标未蜂群化的异常问题
解决beeswarm函数do.plot=F时坐标计算异常的问题
我完全明白你遇到的这个诡异问题——第一次调用beeswarm(do.plot=F)时x坐标挤成一团,第二次正常,关了绘图设备又出问题,确实很头疼!
问题根源
你猜的没错:beeswarm函数在do.plot=F模式下,依赖当前活跃的绘图设备参数(比如绘图区域的宽度、尺寸比例)来计算蜂群的横向间距。当没有任何绘图设备存在时,它会使用默认的最小化占位参数,导致x坐标无法正常分散开;而第一次运行plot()后,绘图设备被创建,第二次调用beeswarm就能获取到正确的设备参数,计算出正常的蜂群坐标;dev.off()关闭设备后,又回到无设备状态,问题重现。
解决方案:提前创建临时虚拟绘图设备
我们可以在调用beeswarm前,先创建一个不生成实际文件的临时绘图设备,让函数能获取到正确的布局参数,计算完成后再关闭这个设备。这样不管什么时候运行,都能得到正确的蜂群坐标,无需先跑一次绘图命令。
修改后的完整代码示例:
library(beeswarm) n <- 250 df = data.frame(x = floor(runif(n, 0, 5)), y = rnorm(n = n, mean = 500, sd = 100)) # 步骤1:创建临时虚拟设备(不会生成任何文件) pdf(file = NULL) # 步骤2:计算蜂群坐标,此时函数能获取到正确的设备参数 A = with(df, beeswarm(y ~ x, do.plot = F)) # 步骤3:关闭临时设备 dev.off() # 步骤4:用计算好的坐标绘图,此时x坐标已经正常蜂群化 plot(x = A$x, y=A$y) # 验证dev.off()后的情况,依然能正常计算 dev.off() # 确保关闭所有活跃设备 pdf(file = NULL) A2 = with(df, beeswarm(y ~ x, do.plot = F)) dev.off() plot(x = A2$x, y=A2$y)
补充说明
- 用
pdf(file = NULL)创建的是后台虚拟设备,不会弹出窗口也不会生成文件,非常适合脚本自动化场景;如果是交互式环境,也可以用dev.new()创建临时窗口,但可能会弹出绘图窗口。 beeswarm的官方文档其实也隐含了这个依赖:当do.plot=F时,函数会使用当前设备的pin(绘图区域尺寸)参数来调整蜂群间距,所以必须保证有活跃的绘图设备才能得到正确结果。
内容的提问来源于stack exchange,提问作者Max Jonatan Karlsson
相关产品推荐
相关产品推荐

