如何将hexbinplot赋值给对象并抑制绘图显示?
当然可以搞定这个问题!我猜你应该是在R环境里用hexbin包的hexbinplot()时遇到的困惑吧?这种“赋值后得到列表、还自动弹出图”的情况很常见,核心原因是不同工具返回的对象类型不一样,咱们分情况解决:
1. 如果你需要保存分箱数据对象(而非直接绘图对象)
hexbin包原生的hexbinplot()默认会直接绘制图形,并且返回的是**hexbin类的分箱数据对象**(本质是包含分箱统计信息的列表结构)。要抑制自动绘图,同时保存这个数据对象,只需要在调用时加上plot = FALSE参数:
library(hexbin) # 先搞点示例数据 x <- rnorm(10000) y <- rnorm(10000) # 抑制绘图,把分箱数据存到myPlot里 myPlot <- hexbinplot(y ~ x, plot = FALSE)
这时myPlot就是包含所有分箱计算结果的对象,不会自动弹出图形。之后如果需要绘图,直接调用plot(myPlot)就能生成六边形分箱图了。
2. 如果你需要保存可直接渲染的绘图对象
如果你的需求是保存一个“随时可以调用显示的绘图对象”(而不是分箱数据),可以换用以下两种方式:
方式一:用latticeExtra的hexbinplot(返回trellis对象)
latticeExtra包的hexbinplot()返回的是标准的trellis绘图对象,而且lattice系列函数默认不会自动打印图形,直接赋值就可以得到对象且抑制显示:
library(latticeExtra) myPlot <- hexbinplot(y ~ x, data = data.frame(x, y))
之后你可以用print(myPlot)手动触发图形显示,或者用png("my_hex_plot.png"); print(myPlot); dev.off()把图保存成文件。
方式二:用ggplot2实现(返回ggplot对象)
如果你更习惯ggplot的语法,也可以结合hexbin包来生成绘图对象,同样赋值后不会自动显示:
library(ggplot2) library(hexbin) myPlot <- ggplot(data.frame(x, y), aes(x, y)) + geom_hex()
后续调用print(myPlot)就能看到图形,或者用ggsave("hex_plot.png", myPlot)直接保存。
为什么你之前得到的是列表?
你之前调用myPlot只输出列表,大概率是因为用了hexbin包原生的hexbinplot()且没加plot=FALSE——它返回的是分箱数据的结构列表,而非绘图对象。按照上面的方法调整后,就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者NicolasBourbaki

