Я надеюсь, что смогу объединить мощные возможности импорта и рисования 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()