Как сохранить текст при сохранении 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.