Используйте изображения SVG в качестве символов в gglot2

Я хотел бы использовать векторную графику, хранящуюся во внешних файлах (например, SVG), в качестве символов построения в ggplot2рисунок. например, следуя этому примеру из виньетки grImport (рис. 8) https://cran.r-project.org/web/packages/grImport/vignettes/import.pdf

В этом примере импортируется пользовательский шейп-файл, а затем он строится с использованием lattice например

xyplot(V8 ~ V7, data = flower, xlab = "Height",
               ylab = "Distance Apart",
               panel = function(x, y, ...) {
                                grid.symbols(PSflower, x, y, units = "native",                     
                                             size = unit(5, "mm"))})

с grid.symbols() исходящий из grImport пакет и PSflower объект Picture, импортированный в другое место grImport.

В ggimage package приближается к этому, но он преобразует изображение в растр ниже черчения, чего я пытаюсь избежать.

Есть ли способ реализовать что-то подобное в ggplot2?

отметка

2 ответа

Решение

Это решение, которое я придумал, похоже, работает очень хорошо. Вы также можете проделать похожий трюк сgrImport. Ключ в том, чтобы убедиться, что нормализованные координаты графика grob совпадают с собственными координатами ggplot.

#Setup
library(grImport2)
library(ggplot2)
library(scales)
src.file <- system.file("SVG", "lwd-rsvg.svg", package="grImport2")
img <- readPicture(src.file)

#Now createa some data
d <- data.frame(x=1:5,y=1:5)

#Need to specify xlims and ylims of plot - this lets us calculate the
#normalised plot coordinates
xlims <- c(0,6)
ylims <- c(0,6)

#Create the plot points using symbolsGrob
sym.grob <- symbolsGrob(img,
                        x=rescale(d$x,from=xlims),
                        y=rescale(d$y,from=ylims),
                        default.units="npc",
                        size=0.3)

#Plot
ggplot(d,aes(x,y))+
  geom_point()+
  annotation_custom(sym.grob)+
  coord_cartesian(xlim=xlims,ylim=ylims,expand=FALSE) #Don't forget this!

Я нашел информацию на ggimageстраница на github здесь: https://github.com/GuangchuangYu/ggimage/issues/2

library(ggimage)
library(ggplot2)

d = data.frame(x = rnorm(10), y = rnorm(10), image='http://jeroen.github.io/images/tiger.svg')

ggplot(d, aes(x,y, image=image)) + geom_image(size=.1)

Здесь используется векторная графика, но, к вашему вопросу, он делает растровым?

Другие вопросы по тегам