Как сохранить текст при сохранении ggplot2 как .svg?

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

Большое спасибо заранее.

Ответ 1

Ни устройство svg() в базе R, ни устройство 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.

Update

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'.

Ответ 2

Вы также можете сохранить графики в формате PDF; после, преобразовать их в SVG (оптимизировано: для небольшого размера, а точность должна быть больше 4 для хороших изображений) с использованием Inkscape.