【问题标题】:Use SVG images as symbols in gglot2在 ggplot2 中使用 SVG 图像作为符号
【发布时间】:2020-08-06 18:40:15
【问题描述】:

我想使用存储在外部文件(例如 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 包,PSflowergrImport 在别处导入的图片对象。

ggimage 包接近于这样做,但它将图像转换为绘图下方的光栅,这是我试图避免的。

有什么办法可以在ggplot2 中实现类似的东西吗?

标记

【问题讨论】:

  • 是的,我做到了。那里提供的许多方法的问题是,当底层源图形是矢量图形时,它们将图像作为栅格放在图上(导致质量下降)。我希望尝试并保持原始 SVG 文件的矢量性质——这应该在 ggplot 可能的范围内。

标签: r ggplot2 ggimage grimport


【解决方案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!

【讨论】:

    【解决方案2】:

    我在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)
    

    这使用矢量图形,但对于您的问题,它会制作光栅吗?

    【讨论】:

    • 是的,我相当肯定它确实如此——如果您查看 ggimage 的代码,您会发现它以或多或少相同的方式处理 SVG 和 PNG 文件,使用 grobRaster 绘制它们。见这里:github.com/GuangchuangYu/ggimage/blob/master/R/geom_image.R 特别是第 122、160 和 178 行。我已经向 ggimage 提交了一个问题,但想知道是否还有其他我忽略的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2021-01-09
    • 2012-12-09
    • 2020-06-02
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多