我希望我可以将出色的导入和绘图功能grImport
与令人敬畏的绘图功能结合起来ggplot2
,但我对grid
系统的理解还不够好,无法找到一种优雅的方式来实现我想要的。我想要的是用ggplot2
使用导入的图像替换图表中的 x 轴刻度标签grImport
。
由于这两个包都使用grid
功能,我希望有一种方法grid.symbols()
可以在ggplot2
框架内使用,这将是理想的,或者至少在设备中的现有绘图上使用。对这些事情有更多了解的人是否知道这样做的可靠方法?或者,谁能指出更多信息来帮助我了解 grobs、视口等?我已经阅读了 Paul Murrel 的 R 图形书中关于网格图形模型的免费章节,但我对 ggplot2 的内部工作原理还不够熟悉,无法建立链接。
我的问题与关于使用图像作为绘图点的现有问题非常相似,尽管我对轴标签而不是绘图点更感兴趣。但是,我很好奇这两个任务有多相似,以及该解决方案是否可以用于此目的。我无法自己弄清楚。
这是我的第一篇文章,所以我不允许发布图片,但这段代码实现了接近我想要的东西。注意:这种方法使用了一种丑陋、丑陋的 hack,它不可移植且不能令人满意。我要生成的最终图将具有构面facet_grid
(不需要大量的试验和错误。
library(ggplot2)
## library(grImport) # not needed for this example, but would be for grid.symbols()
p <- ggplot(mtcars, aes(cyl, mpg)) + stat_summary(fun.data = "mean_cl_boot")
print(p)
## Replace (in this case, overlay) x-axis tick labels with a graphic / grob
iconSize <- 0.05
iconHt <- 0.2
padding <- 0.09 # horizontal padding around axis: I found this by trial & error
tickSp <- (1-padding)/(4*2)
downViewport("axis_h-5-3")
## I would use grid.symbols() with an imported Picture in place of grid.circle(),
## but the idea is the same: draw a shape at the ticks along the axis.
for (i in 0:(max(mtcars$cyl) - min(mtcars$cyl)) )
{
grid.circle(x = (padding/2 + tickSp*(i*2)), y = iconHt,
r = iconSize*(min(mtcars$cyl)+i), gp = gpar(fill="black"))
}
upViewport()