r2e*_*ans 5 grid r ggplot2 r-base-graphics
有没有办法以编程方式非破坏性地知道当前图形设备是否是基础图形?
我需要它是非破坏性的,因为它不会打开新设备、关闭当前设备或以其他方式修改它(例如,添加点/线等)。
例如,
isbasegx <- function() {
length(dev.list()) > 0 && # dev.interactive() &&
!identical(par("usr"), c(0, 1, 0, 1))
}
Run Code Online (Sandbox Code Playgroud)
(编辑删除dev.interactive(),因为这在报告生成中也很有用。)
这可能是一个开始,但是任何依赖的东西par()都会失败,因为基于网格的图形不会更新它们(这并不奇怪):
plot(1, 1)
par1 <- par()
ggplot(mtcars, aes(mpg, disp)) # same graphics device
par2 <- par()
all(mapply(identical, par1, par2))
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
图形类型还有哪些其他“提示”?
问题在于,在 R 中,图形设备没有两种相互排斥的“模式”,我们可以将其分类为基础 R 图形或网格图形。这些只是(?唯一的)两个不同的图形 API,我们可以使用它们将像素绘制到 R 中的绘图设备上。事实上,以下代码示例演示了完全可以混合和匹配:
library(grid)
plot(1:10)
par(new = TRUE)
grid.rect(width = 0.5, height = 0.5, gp = gpar(lwd = 3), name = "gr")
lines(2:6, c(6, 4, 5, 6, 1), col = 'red')
Run Code Online (Sandbox Code Playgroud)
在这里,我们在基本 R 图形中绘制了一个散点图,然后使用网格绘制了一个矩形,然后再次在基本 R 图形中在顶部绘制了一条红线。
当我们绘制完上面的图像后,我们不能说当前的图形设备‘是’base R或者‘是’grid。它包含使用两者的调用来绘制的图形基元。
编辑
如果您试图确定最后一个绘图是 ggplot 还是基本 R 图形,您可以尝试询问 的内容recordPlot,它会记录绘制图形基元的调用。因此,您可以执行以下操作:
is_it_a_ggplot <- function() {
'ggplot2' %in% unlist(lapply(recordPlot()[1][[1]], function(x) {
x <- x[[2]][[1]]
if('name' %in% names(x)) x$name else as.character(x)
}))
}
is_it_base <- function() {
'C_plot_new' %in% unlist(lapply(recordPlot()[1][[1]], function(x) {
x <- x[[2]][[1]]
if('name' %in% names(x)) x$name else as.character(x)
}))
}
library(ggplot2)
ggplot(iris, aes(Sepal.Width, Petal.Length, col = Species)) +
geom_point()
Run Code Online (Sandbox Code Playgroud)

is_it_a_ggplot()
#> [1] TRUE
is_it_base()
#> [1] FALSE
plot(1:10)
Run Code Online (Sandbox Code Playgroud)

is_it_a_ggplot()
#> [1] FALSE
is_it_base()
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |