Как я могу использовать графику, импортированную с помощью grImport, в качестве меток осей в ggplot2 (с использованием функций сетки)?

Я надеюсь, что смогу объединить элегантные возможности импорта и рисования grImport с потрясающей графической мощностью ggplot2 , но я просто недостаточно хорошо понимаю систему grid , чтобы найти элегантный способ достижения того, что я хочу. Я хочу заменить метки деления оси x на графике ggplot2 изображениями, импортированными с помощью grImport .

Поскольку оба пакета используют функции grid , я надеюсь, что есть способ использовать grid.symbols () в рамках ggplot2 , что было бы идеально, или хотя бы на имеющемся участке в устройстве. Кто-нибудь, кто разбирается в таких вещах, знает надежный способ сделать это? Или кто-нибудь может указать мне дополнительную информацию, которая поможет мне узнать о гробах, окнах просмотра и т. Д.? Я прочитал бесплатную главу книги Пола Мюррела по R о графической модели Grid, но я недостаточно знаком с внутренней работой ggplot2, чтобы сделать ссылку.

Мой вопрос очень похож на существующий вопрос об использовании изображения в качестве точки графика , хотя меня больше интересуют метки осей, а не точки графика.Однако мне было бы любопытно, насколько похожи эти две задачи, и можно ли адаптировать это решение для этой цели. Я не мог понять это самостоятельно.

Это мой первый пост, поэтому мне не разрешено публиковать изображения, но этот код позволяет достичь чего-то близкого к тому, что я хочу. Примечание: в этом подходе используется уродливый, уродливый хакер, который не переносится и не соответствует требованиям. Окончательный график, который я хочу создать, будет иметь фасеты ( 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()

14
задан Community 23 May 2017 в 12:15
поделиться