Используйте изображения SVG как символы в gglot2 - PullRequest
1 голос
/ 23 апреля 2020

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

enter image description here

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

Можно ли как-нибудь реализовать нечто подобное в ggplot2?

Mark

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Это решение, которое я придумал, похоже, работает довольно хорошо. Вы также можете сделать аналогичный трюк с grImport. Ключ удостоверяется, что нормализованные координаты графика гроба совпадают с собственными координатами 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!

enter image description here

1 голос
/ 24 апреля 2020

Я нашел информацию на странице github ggimage здесь: 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)

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

enter image description here

...