Подтвердить что ты не робот

Создание изображения векторной графики (т.е. Метафайла) в R, подходящего для печати в Word 2007

Сначала предостережение: я разместил этот вопрос здесь на SuperUser, но, очевидно, неправильное место задавать вопросы R. Я понимаю, что это не вопрос программирования, но я считаю, что он может быть решен путем изменения того, как создаются графики (т.е. Путем кодирования соответственно). Поэтому я надеюсь, что читатели найдут это подходящим для форума.

R-графики обычно состоят целиком из элементов векторной графики (т.е. точек, линий, многоугольников, текста). R позволяет сохранять фигуру (или скопировать-вставить) в различные форматы, включая различные растровые форматы, в формате PDF или в виде метафайла Windows.

Обычно я сохраняю свои изображения в формате PDF и печатаю их. Это делает изображения точно так же, как я намеревался их на бумаге, в самом высоком качестве. Я избегаю растровых форматов (например, JPG, TIFF) для печати, поскольку качество изображения ухудшается, а издатели предпочитают векторные форматы.

Однако мне нужно сделать большой многостраничный рабочий стол, опубликованный с помощью Microsoft Word 2007, и поэтому использование PDF файлов не является вариантом. Когда я импортирую свои данные из метафайлов или копирую и вставляя непосредственно из R в Word, изображение и изображение на экране и печать изображения немного меняются (например, полигоны и их заполнения слегка смещаются).

Учитывая, что я хочу сохранить высокое векторное качество (а не использовать растровые форматы), что я могу сделать, чтобы сделать векторную графику R работать с Word? (Конечно, Sweave и LaTeX были бы хороши, но опять же, не реалистичный вариант).

Рассмотрим следующий пример:

plot(c(1:100), c(1:100), pch=20)
## Copy and paste to Word 2007 as Windows metafile
## Print
## Quality is poorer (e.g. dot fills misaligned with borders)

pdf("printsPerfectly.pdf")
plot(c(1:100), c(1:100), pch=20)
dev.off()
## Now print PDF
## Quality is as expected

EDIT: В дополнение к предложениям @John я подготовил его как файл постскриптума EPS (см. ниже), вставил его как изображение в Word. Поскольку в конечном итоге он будет напечатан из PDF файла, созданного из Word, я преобразовал его в PDF, используя настройки по умолчанию Word 2007, напечатал его на моем лазерном принтере HP Laserjet P1606dn, а затем сделал снимок для иллюстрации проблемы с границами полигонов и ошибками смещения ( изображение слева, внизу). Я также произвел его непосредственно в формате PDF из R с помощью pdf() и распечатал PDF-документ и сделал снимок (изображение справа, ниже).

Illustration of misalignment (left) and perfection (right)

Это может показаться маленьким картофелем! Но когда вы столкнулись с множеством проблем, чтобы достичь высокого качества, разочарование в том, что его прервут в конце. Кроме того, здесь это не совсем очевидно, но цифры не такие качественные (слева), как в PDF (справа), без учета различий в фокусе фотографии.

4b9b3361

Ответ 1

Ваш единственный вариант - использовать растровую графику высокого разрешения. Как только вы достигнете 300 точек на дюйм, он будет полностью неотличим от векторной печати; он просто сделает большие файлы. Ваш метод копирования и вставки находится на 72 dpi и будет выглядеть ужасно. Если вы импортируете из файла, вы можете получить разрешение в файле, и все будет намного лучше. К счастью, Office 2007 должен обрабатывать png-изображения, которые имеют наилучшее сжатие для типичных графиков. Скажем, вы хотели, чтобы изображение получилось 4 "широким и 6" высоким...

png('printsGreat.png', width = 4, height = 6, units = 'in', res = 300)
plot(c(1:100), c(1:100), pch=20)
dev.off()

Кроме того, предполагается, что Office 2007 сможет обрабатывать файлы EPS, а файлы postscript R по умолчанию совместимы с EPS при печати одной страницы.

postscript("printsPerfectly.eps", width = 4, height = 6, horizontal = FALSE, onefile = FALSE)
plot(c(1:100), c(1:100), pch=20)
dev.off()

Но если вам не повезло с ними, вернитесь к изображению с высоким разрешением.

Ответ 2

Нынешний лучший ответ выше меня неприемлем, так как, если кто-то идет на проблему создания хорошей векторной фигуры, последнее, что нужно сделать, это просто растрировать его на растровое изображение... Если это не невероятно сложный граф который занимает много времени для визуализации в векторном формате или что-то в этом роде, но для большинства графиков это не так.

Фактически, лучшее решение, которое я видел до сих пор, чтобы сделать графики R (базовые графики R, графики решетки или ggplots) работать вместе с Office (Word, Powerpoint), заключается в том, чтобы экспортировать их непосредственно в Powerpoint с использованием пакета ReporteRs, как в

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)
)
mydoc = addPlot( mydoc, function( ) print( myplot ), vector.graphic=TRUE) 
writeDoc( mydoc, file = "test plot.pptx" )

enter image description here

Это приводит к полностью редактируемому высокоуровневому графику Powerpoint в собственном формате DrawingML на основе Office, который вы также можете легко скопировать и вставить в виде расширенного метафайла, если хотите (используя Copy... Paste special... Enhanced metafile) и который в отличие от EMF, экспортируемых из R, также полностью поддерживает прозрачность. Для окончательной обработки вы также можете легко распечатать его в формате PDF с Powerpoint, если это необходимо, и тогда он будет оставаться красивым в векторном формате.

Для вашего простого примера это дает нам:

library( ReporteRs )
mydoc = pptx(  )
mydoc = addSlide( mydoc, slide.layout = "Title and Content" )
mydoc = addTitle( mydoc, "" )
myplot = function( ) {return(plot(c(1:100), c(1:100), pch=20))}
mydoc = addPlot( mydoc, fun=myplot, vector.graphic=TRUE, offx=0,offy=0,width=12, height=8, fontname="Calibri", pointsize=20)  
writeDoc( mydoc, file = "test plot2.pptx" )

enter image description here

Или увеличен, чтобы показать, что это хорошее качество (и редактируемый векторный формат):

enter image description here

Импорт PDF файла из R-графика в Inkscape, а затем его экспорт из него в расширенный метафайл также приводит к лучшим показателям, чем при использовании прямого экспорта в EMF из R (изначально или с помощью devEMF), но это не так хорошо как решение выше, и все еще глючит.

Второе лучшее решение - экспортировать в EMF с помощью пакета devEMF. В этом случае это дает нам

library(devEMF)
emf(file="example.emf", bg="white", width=12, height=8, family="Calibri", pointsize=20)
plot(c(1:100), c(1:100), pch=20)
dev.off()

но рендеринг на экране в powerpoint, например, не так хорош, поскольку он отображает не сглаженные (здесь увеличено изображение, чтобы показать это), а прозрачность также не поддерживается: enter image description here

Щелчок правой кнопкой мыши по изображению и выбор Ungroup преобразует его в собственный формат Office DrawingML, который затем будет отображаться сглаживанием, но размещение текстовых меток немного перепутано (в этом случае разрешается выбор и центрирование всего текста): [ TG34]

Поэтому решение, которое я дал выше, явно лучше.

EDIT: теперь я сделал [небольшой пакетный export ] с вспомогательными функциями graph2ppt и graph2doc чтобы экспортировать graph2doc активный график в Powerpoint или Word, а также table2doc, table2ppt и table2html чтобы экспортировать ранее показанный объект статистики R в Word, Powerpoint или HTML таблица, например:

install.packages("rJava")
install.packages("ReporteRs")
install.packages("ReporteRsjars")
install.packages("ggplot2")
install.packages("rtable")
install.packages("xtable")
install.packages("taRifx")
install.packages("devtools")
library(devtools)
devtools::install_github('tomwenseleers/export',local=F)

library(export)

?graph2ppt
?table2doc

## export of ggplot2 plot
library(ggplot2)
qplot(Sepal.Length, Petal.Length, data = iris, color = Species, 
      size = Petal.Width, alpha = I(0.7))
graph2ppt(file="ggplot2 plot.pptx", aspectr=1.7)

# add 2nd slide with same graph in different aspect ratio
graph2ppt(file="ggplot2 plot.pptx", aspectr=1.3, append=T) 
# add 3d slide with same graph with fixed width & height
graph2ppt(file="ggplot2 plot.pptx", width=6, height=5, append=T) 

# export of aov Anova output
fit=aov(yield ~ block + N * P + K, npk)
summary(fit)
table2doc(file="table_aov.docx")
summary(fit)
table2doc(file="table_aov.docx",append=T,digits=4)
summary(fit)
table2doc(file="table_aov.docx",append=T,digits=4,digitspvals=1)
summary(fit)
table2html(file="table_aov.html")

Если кто-нибудь найдет какие-нибудь ошибки, дайте мне знать!

Ответ 3

Мое предпочтительное решение - использовать метафайлы Windows для построения, например:

win.metafile("mygraph.wmf")
print(gg1)
dev.off()

Это создает файл *.wmf, который можно скопировать в файл слова.

Ответ 4

Пакет devEMF, похоже, создает графику, которая выглядит лучше, чем wmf по умолчанию при вставке в PowerPoint.

Ответ 5

Так как я пытался создать png при высоком res в R, и он, похоже, не работал на моем ПК (если бы я установил разрешение выше, скажем, 300 dpi, R выдаст ошибку типа "не может запустить png-устройство" ), то, как я нашел, это сохранить фигуру с помощью postscript(), а затем использовать GSView для преобразования файла ps в png с разрешением 600 dpi. MS Word удовлетворяет png счастливо, и качество печати кажется идеальным.