【问题标题】:R: Importing vector graphics to a plot - Cannot get grImport to workR:将矢量图形导入绘图 - 无法使 grImport 工作
【发布时间】:2015-04-28 12:43:39
【问题描述】:

我正在尝试使用 grImport 包 (http://cran.r-project.org/web/packages/grImport/index.html) 将外部矢量图像导入 R 图中,例如我拍了这张照片:

然后我使用 ImageMagick 的转换转换为 ps:

convert crashed.jpg crashed.ps

我启动 R 并发出以下命令:

R> library("grImport")
R> PostScriptTrace("crashed.ps", "crashed.xml")
R> myPic = readPicture("crashed.xml")
R> grid.picture(myPic)

然后根据http://cran.r-project.org/web/packages/grImport/vignettes/import.pdf 应该显示图像。但我得到的只是一个空的情节!

R> sessionInfo()
R version 3.1.3 (2015-03-09)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.10.3 (Yosemite)

【问题讨论】:

  • 您查看过 XML 文件吗?或者考虑发布它?您是否尝试过更简单的图像 - 可能像这样使用 ImageMagick 制作一个 convert -size 400x400 xc:blue -draw "rectangle 10,10 200,200" test.png
  • @MarkSetchell:感谢您的回复。如果我按照建议创建文件test.png,然后使用与上述相同的命令,我仍然会弹出空图。以下是生成的test.xml 文件的内容:<?xml version='1.0' encoding='ISO-8859-1' ?> <picture version='3' xmlns:rgml='http://r-project.org/RGML' source='test.ps' date='2015-04-28 16:25:19' creator='R (3.1.3)' > <summary count='0' ymax='-99999' ymin='99999' xmax='-99999' xmin='99999'/> </picture> 。我对 XML 格式没有经验。
  • 我也不是 XML 专家,但它似乎不包含 ImageMagick 创建的任何矩形...

标签: r


【解决方案1】:

这是一个相当古老的问题。鉴于它仍然没有答案,我想我会分享一些将外部图形合并到 R 图中的现代工具。

预赛

使用 ImageMagick 或等效工具,将源 .jpg 转换为 .pdf。在 Linux 上,这是使用 convert crashed.jpg crashed.pdf 完成的。我们还将在整个答案中使用以下基图:

library( ggplot2 )
g0 <- ggplot( mtcars, aes(disp, mpg) ) + geom_point() + theme_bw()

使用grImport2 将图像作为绘图面板导入

我们首先使用grConvert 将.pdf 转换为.svg,然后将其导入并转换为grob 对象。

grConvert::convertPicture( "crashed.pdf", "crashed.svg" )
p <- grImport2::readPicture( "crashed.svg" )
g <- grImport2::pictureGrob( p )
gridExtra::grid.arrange( g0, g, nrow=1 )

使用cowplot 将图像覆盖在现有绘图的顶部

与上述不同,此解决方案直接使用 .jpg:

## Ensure magick is installed for draw_image()
if(!require("magick")) install.packages( "magick" )
cowplot::ggdraw(g0) + cowplot::draw_image("crashed.jpg", x=0.25, y=0.25, scale=0.25)

egg 的帮助下使用图像作为绘图元素

这种方法也可以直接用于 .jpg。我们加载图像并使用结果对象填充mtcars 中的新列。然后可以以标准 ggplot 方式将该列提供给geom_custom()

mtcars$img <- list(jpeg::readJPEG( "crashed.jpg" ))
g0 + egg::geom_custom( data=mtcars, aes(data=img), grob_fun=grid::rasterGrob,
                      fun_params = list(height=unit(1,"lines")) )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 2014-04-02
    • 2023-03-03
    • 2010-12-04
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2017-04-18
    相关资源
    最近更新 更多