保存ggplot2为.svg时如何保存文本?

时间:2013-07-09 18:15:05

标签: r svg ggplot2 knitr

我正在尝试以svg格式保存ggplot2图。我没有使用ggsave函数,因为绘图是作为knitr文档的一部分生成的 - 我为绘图指定的设备是'svg'。

问题是原始图中的文本元素在svg文件中显示为路径,至少在inkscape中打开时。 svg的源代码看起来不包含任何文本。

我的绘图功能在一个单独的文件中定义:

## @knitr plot_histogram
ggplot(mainFrame[complete.cases(mainFrame),]) 
+ geom_boxplot(aes(x=source, y = pPfam, fill = source)) 
+ scale_y_continuous(limits = c(0,1)) 

在knitr文档中,我调用该函数并使用'svg'设备保存图像。

```{r plot_histogram, dev = 'svg', fig.width= 7, fig.height=4, fig.show='hold', fig.path="figure/summary"}
```

所以我不确定在保存svg时如何告诉'svg'设备或ggplot2我想保留文本?如果可以解决问题,我也很乐意使用其他图形设备。

非常感谢提前。

2 个答案:

答案 0 :(得分:14)

基础R中的svg()设备和CairoSVG()包中的Cairo设备都不支持此功能。所有文本都变成了像

这样的字形
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 3.921875 -2.046875 L 3.921875 0.... "/>
</symbol>

我不知道为什么会出现这种情况,您可能想要向r-devel邮件列表提交功能请求。此问题并非针对ggplot2 / knitr。它来自SVG设备。

更新

OP指出RSvgDevice确实有效,我们可以通过以下方式指定设备:

my_svg <- function(file, width, height) {
  library(RSvgDevice)
  devSVG(file = file, width = width, height = height, bg = "white", fg = "black",
         onefile = TRUE, xmlHeader = TRUE)
}

然后在knitr代码块中,使用选项dev='my_svg'

答案 1 :(得分:1)

您也可以将图表保存为PDF格式;之后,使用Inkscape将它们转换为SVG(优化:小尺寸;精度必须大于4才能获得良好的图像)。