r - 如何使用 grImport 导入的图形作为 ggplot2 中的轴刻度标签(使用网格函数)?

标签 r ggplot2 axis-labels r-grid

我希望我可以结合 grImport 的出色导入和绘图功能ggplot2 的强大绘图能力,但我根本不明白grid系统足够好,可以找到一种优雅的方式来实现我想要的。我想要的是替换 ggplot2 中的 x 轴刻度标签带有使用 grImport 导入的图像的图表.

由于两个包都使用 grid函数,我希望有一种方法可以使用 grid.symbols()ggplot2 内框架,这将是理想的,或者至少在设备中的现有绘图上。对这些事情有更多了解的人是否知道这样做的可靠方法?或者,谁能指出更多信息来帮助我了解 grobs、视口(viewport)等?我已通读 free Chapter of Paul Murrel's R graphics book在网格图形模型上,但我对 ggplot2 的内部工作原理还不够熟悉,无法建立链接。

我的问题与 an existing question about using an image as a plot point 非常相似,虽然我对轴标签而不是情节点更感兴趣。但是,我很好奇这两个任务有多相似,以及该解决方案是否可以用于此目的。我无法自己弄清楚。

这是我的第一篇文章,所以我不允许发布图片,但是这段代码实现了我想要的东西。注意:这种方法使用了一种丑陋、丑陋的 hack,它不可移植且不能令人满意。我要生成的最终图将具有构面( facet_grid ),x 轴是因子 每个轴上都有不同的图片打勾 ,而不是一个连续变量,这就是为什么我正在寻找一个不需要大量试验和错误的更通用/稳健的解决方案。

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()

最佳答案

这是一个例子:

# convert ps to RGML
PostScriptTrace(file.path(system.file(package = "grImport"), "doc", "GNU.ps"), "GNU.xml")
PostScriptTrace(file.path(system.file(package = "grImport"), "doc", "tiger.ps"), "tiger.xml")
# read xml
pics <- list(a = readPicture("GNU.xml"), b = readPicture("tiger.xml"))

# custom function for x axis label.
my_axis <- function () {
  structure(
      function(label, x = 0.5, y = 0.5, ...) {
         absoluteGrob(
           do.call("gList", mapply(symbolsGrob, pics[label], x, y, SIMPLIFY = FALSE)),
           height = unit(1.5, "cm"))
    }
)}

qplot(factor(c("a", "b")), 1:2) + opts( axis.text.x = my_axis())

enter image description here

关于r - 如何使用 grImport 导入的图形作为 ggplot2 中的轴刻度标签(使用网格函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8905101/

相关文章:

java - WstxUnexpectedCharException : Unexpected character '"' (code 34) in DOCTYPE declaration; expected a space between public and system identifiers

python - 防止轴在相机移动时更新 - mayavi python

使用 fread、data.table 包读取链 (+, -) 列

r - 基于 2 列的组值

r - 为 aes() 内的 geom_rect 中的填充和颜色指定不同的 alpha?

r - 直方图中条形组之间的间距

r - 如何在 ggplot 图的图例中添加额外的符号?

r - 如何创建一个新列表,其中包含 R 中旧列表中的每个单独的矩阵列?

r - 使用 ggplot2 绘制彩色编码的世界地图

python - 如何使用 plt.savefig 正确显示足够的刻度标记?