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

R Элементы графика масштаба в формате PDF с заданной шириной и высотой

Хотя графики R, отправленные в PDF, могут быть перемасштабированы по желанию в программном обеспечении для иллюстрации или макета страницы, научные журналы часто настаивают на том, что предоставленные графики имеют определенные размеры.

Можно ли масштабировать размер всех элементов построения в пределах заданного размера PDF непосредственно в R?

require(ggplot2)

p <- qplot(data=iris,
           x=Petal.Width,
           y=Petal.Length,
           colour=Species)

pdf("./test_plot_default.pdf")
print(p)
graphics.off()

Производит адекватное масштабирование элементов графика

test plot with default pdf size

Однако изменение элементов формата PDF не приводит к масштабированию элементов графика. С меньшими PDF файлами элементы графика слишком увеличены по сравнению с пространством заговора.

pdf("./test_plot_dimentionsions required by journal.pdf", width=3, height=3)
print(p)
graphics.off()

enter image description here

Использование предложения @Rosen Matev:

update_geom_default("point", list(size=1))
theme_set(theme_grey(base_size=6))
pdf("./test_plot_dimentionsions required by journal.pdf", width=3, height=3)
print(p)
graphics.off()

enter image description here

4b9b3361

Ответ 1

Журналы настаивают на том, чтобы иметь конкретные размеры участка, чтобы избежать масштабирования. Если сделано, это может сделать размер шрифта слишком малым (или большим) и не соответствовать размеру шрифта подписи рисунка. Вот почему элементы сюжета (текст, размер точки и т.д.) По дизайну имеют одинаковый абсолютный размер независимо от размера pdf.

Вы можете изменить размер и размер шрифта по умолчанию, например:

p <- ggplot(iris, aes(x=Petal.Width, y=Petal.Length, colour=Species)) +
  geom_point(size=1.5) +  # default is 2
  theme_grey(base_size=10)  # default is 12
ggsave("test.1.pdf", p)

Значения по умолчанию также могут быть изменены глобально:

update_geom_default("point", list(size=1.5))
theme_set(theme_grey(base_size=10))

Ответ 2

Как ни странно, вы можете сделать это с помощью scale= в ggsave(...)

require(ggplot2)
p <- qplot(data=iris, x=Petal.Width, y=Petal.Length, colour=Species)
ggsave("test.1.pdf",p)
ggsave("test.2.pdf",p, width=3, height=3, units="in", scale=3)

Попробуйте сыграть с параметром scale и посмотреть, что вы получите...

Ответ 3

Рассмотрите возможность использования width, height и pointize в функции pdf().

Если вам нравится использовать pdf() вместо других способов, таких как использование sweave, то лучше использовать функцию pdf с большим количеством аргументов, например, ниже (у меня нет ggplot2, поэтому поставляется файл simillar).

# making scaled plot in pdf
# using paper=a4 just to see the efect

for (sc in c(0.5,0.75,1)) {
pdf(width=7*sc,height=7*sc,pointsize=12*sc,file=paste("scale",sc,".pdf",sep=""),paper="a4")
plot(sin((1:314)/100),main=paste("PDF sc",sc))
dev.off()  
}

Это вполне применимо, но работает в некоторой степени. После того, как масштаб слишком мал, в формате pdf начнет применяться ширина линии, шрифт и т.д.

См. результаты в масштабе *.pdf, созданные на примере.

И для ggplot2...

sc <- c(0.5,0.75,1)
fi <- c("pic1.pdf","pic2.pdf","pic3.pdf")

require(ggplot2)
p <- qplot(data=iris,
x=Petal.Width,
y=Petal.Length,
colour=Species)

for (i in 1:3) {
pdf(width=7*sc[i],height=7*sc[i],pointsize=12*sc[i],file=fi[i])
print(p)
dev.off()  
}

Латексный код для проверки файлов, как они выглядят в одном документе:

\documentclass[a4paper,11pt]{report}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{graphics}

\begin{document}

\begin{figure}
     \includegraphics{pic1.pdf}
 \end{figure}

\begin{figure}
     \includegraphics{pic2.pdf}
\end{figure}

\begin{figure}
    \includegraphics{pic3.pdf}
\end{figure}

\end{document}

Ответ 4

Опция одинаково хороша или лучше, чем PDF. Все журналы, с которыми я столкнулся, похожи на tiff.

tiff(filename="name.tiff", width=5, height=5, units="in",
     pointsize=8, compression="lzw", bg="white", res=600,
     restoreConsole=TRUE)
qplot(data=iris, x=Petal.Width, y=Petal.Length, colour=Species)
dev.off()

Если вы используете linux, отбросьте restoreConsole=TRUE, кажется, что это нравится только окнам.