在 ggplot2 中使用 SVG 图像作为符号
Use SVG images as symbols in gglot2
我想使用存储在外部文件(例如 SVG)中的矢量图形作为 ggplot2
图中的绘图符号。例如遵循 grImport 插图中的这个示例(图 8)https://cran.r-project.org/web/packages/grImport/vignettes/import.pdf
此示例导入自定义 shapefile,然后使用 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
是由 grImport
从别处导入的图片对象。
ggimage
包接近于执行此操作,但它将图像转换为低于绘图的光栅,这是我试图避免的。
有什么方法可以在 ggplot2
中实现类似的东西吗?
马克
我在 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)
这使用了矢量图形,但对于您的问题,它会生成光栅图吗?
这是我想出的解决方案 - 似乎工作得很好。你也可以用 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!
我想使用存储在外部文件(例如 SVG)中的矢量图形作为 ggplot2
图中的绘图符号。例如遵循 grImport 插图中的这个示例(图 8)https://cran.r-project.org/web/packages/grImport/vignettes/import.pdf
此示例导入自定义 shapefile,然后使用 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
是由 grImport
从别处导入的图片对象。
ggimage
包接近于执行此操作,但它将图像转换为低于绘图的光栅,这是我试图避免的。
有什么方法可以在 ggplot2
中实现类似的东西吗?
马克
我在 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)
这使用了矢量图形,但对于您的问题,它会生成光栅图吗?
这是我想出的解决方案 - 似乎工作得很好。你也可以用 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!