Как сохранить прозрачность в ggplot2?
Мне нравятся сюжеты, которые генерирует ggplot. Тем не менее, по-прежнему довольно сложно получить графики качества публикации напрямую. Обычно мне приходится делать некоторую пост-обработку в Illustrator (т.е. Изменять шрифты, цифры и т.д.). Хотя я мог бы сэкономить как tiff или png, eps лучше всего подходит для манипуляции фигурами в Illustrator (я могу разгруппировать объекты, переместить легенду/текст и т.д.).
Когда я сохраняю объект ggplot с некоторой прозрачностью (либо в точках, либо более гладкой), я получаю эту ошибку:
Warning message:
In grid.Call.graphics("L_points", x$x, x$y, x$pch, x$size) :
semi-transparency is not supported on this device: reported only once per page
Есть ли обходной путь?
Ответы
Ответ 1
R eps "device" не поддерживает частичную прозрачность, но, если я правильно помню, его устройство PDF делает. Иллюстратор должен иметь возможность читать PDF файлы с равным доступом к EPSes, или если нет, попробуйте преобразовать их после поколения с помощью pdftops
(не pdf2ps
, это совершенно разные программы, а выход pdf2ps - ниже).
Обратите внимание, что R не пытается полностью оптимизировать свой вывод PDF, поэтому даже если у вас есть сюжет, который не требует постпродакшн, вы захотите запустить его с помощью утилиты сжатия, например qpdf
.
Ответ 2
Это работает:
ggsave("filename.eps", device=cairo_ps)
Ответ 3
У меня были те же проблемы с использованием функции postscript
. Я обнаружил, что cairo_ps
из пакета grDevices
поддерживает прозрачность (по крайней мере, в Ubuntu 10.04 с R версии 2.10.1). Использование:
cairo_ps(filename='filename.eps', width=7, height=7)
plot(x,y)
dev.off()
Ответ 4
Вы также можете попробовать экспортировать SVG через svg-устройство. Не уверен, что Illustrator может читать SVG, но Inkscape может, и он открывает исходный код:) Я сделал несколько хороших вещей с выходом R для SVG в Inkscape, и группировки сохраняются как с EPS. Не может быть на 100% уверен, что он обрабатывает непрозрачность, но я уверен, что это в стандарте SVG.
Ответ 5
Формат EPS в принципе не поддерживает полупрозрачность - если вы хотите полупрозрачность и сможете редактировать в Illustrator или Inkscape, вам лучше экспортировать в SVG или PDF. Если вы действительно привязаны к EPS-формату, вы можете использовать устройство cairo
, хотя и указать, при каком разрешении нужно полупрозрачные объекты растеризовать (только не-полупрозрачные элементы остаются в качестве векторного формата, хотя, хотя и полупрозрачные области растрируются в растровое изображение). Синтаксис для этого:
cairo_ps(file = "test.eps", onefile = FALSE, fallback_resolution = 600)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))
dev.off()
или
ggsave("filename.eps", device=cairo_ps, fallback_resolution = 600)
Альтернативный вариант - экспортировать в MS Office Powerpoint в векторном формате и выполнять любое редактирование макета. Это можно сделать с помощью ReporteRs
или моего собственного пакета export
, который был построен на нем:
library( ReporteRs )
require( ggplot2 )
mydoc = pptx( )
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
mydoc = addTitle( mydoc, "Plot examples" )
myplot = qplot(Sepal.Length, Petal.Length
, data = iris, color = Species
, size = Petal.Width, alpha = I(0.7)
)
# Add titles and then 'myplot'
mydoc = addPlot( mydoc, function( ) print( myplot ), vector.graphic=TRUE)
writeDoc( mydoc, file = "test plot.pptx" )
![enter image description here]()
или используя мой пакет export
(https://github.com/tomwenseleers/export):
library(export)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))
graph2ppt(file="plot.pptx", width=8, aspectr=sqrt(2))
Это приводит к полностью редактируемому высокому графику Powerpoint в собственном формате DrawingML на основе Office с полной поддержкой прозрачности. Там вы можете легко исправить незначительные проблемы с форматированием и экспортировать в PDF файл высокого качества, выполнив печать в формате PDF.