knitr: добавить заметки к рисункам
У меня есть фигура, которая выглядит так:
<<foo, fig.lp='', fig.cap='name', fig.subcap=c('left', 'right'),>>=
plot1
plot2
@
Теперь я хотел бы отобразить ряд примечаний об этом рисунке прямо ниже (т.е. многострочный текст). Есть ли удобный способ сделать это в среде фигуры, созданной knitr?
Как уже указывалось в комментариях выше, в настоящее время нет решения моей проблемы. Я подал запрос на функцию.
2 ответа
Я знаю, что это действительно поздний ответ, но вот что я в итоге сделал для того же типа проблемы.
Я определил пользовательский крючок, который будет отображать изображение так, как я хочу
# Custom knitr hook to add notes to the plot
knit_hooks$set(plot = function(x, options) {
paste("\n\\end{kframe}\n\\begin{figure}\n",
"\\includegraphics[width=\\maxwidth]{",
opts_knit$get("base.url"), paste(x, collapse = "."),
"}\n",
"\\textsc{Note} -- here is some car stuff with notes",
"\\caption{", options$fig.cap, "}\n",
"\n\\end{figure}\n\\begin{kframe}\n",
sep = '')
})
Вот полный.Rnw
\documentclass{article}
\usepackage[font=large,labelfont=sc]{caption}
\begin{document}
<<setup, echo=FALSE, message=FALSE, results='hide'>>=
suppressPackageStartupMessages({
library(ggplot2)
})
opts_chunk$set(echo=FALSE)
opts_chunk$set(results="hide")
@
<<foo, fig.cap='with notes', fig.height=4, fig.width=6>>=
# save a regular plotting function
regular_plot <- knit_hooks$get("plot")
# Custom knitr hook to add notes to the plot
knit_hooks$set(plot = function(x, options) {
paste("\n\\end{kframe}\n\\begin{figure}\n",
"\\includegraphics[width=\\maxwidth]{",
opts_knit$get("base.url"), paste(x, collapse = "."),
"}\n",
"\\textsc{Note} -- here is some car stuff with notes",
"\\caption{", options$fig.cap, "}\n",
"\n\\end{figure}\n\\begin{kframe}\n",
sep = '')
})
ggplot(data = mtcars) + geom_point(aes(disp,mpg))
@
<<bar, fig.cap='without notes', fig.height=4, fig.width=6>>=
# restore regular plotting function
knit_hooks$set(plot = regular_plot)
ggplot(data = mtcars) + geom_point(aes(disp,mpg))
@
\end{document}
и вот итоговый PDF:
Ахмед ответил просто потрясающе!
Я сделал небольшую модификацию для Rmd, чтобы сначала получить заголовок и сделать обобщение для каждого фрагмента документа.
Мы должны добавить эти строки в начало:
knit_hooks$set(plot = function(x, options, .notes = notes, .sources = sources) {
paste("\n\n\\begin{figure}\n",
"\\includegraphics[width=\\maxwidth]{",
opts_knit$get("base.url"), paste(x, collapse = "."),
"}\n",
"\\caption{",options$fig.cap,"}","\\label{fig:",opts_current$get("label"),"}","\\textsc{}",
"\n\\textsc{Notas} -- ",.notes,
"\n\\textsc{Fuentes} -- ", .sources,
"\n\\end{figure}\n",
sep = '')
})
Затем в каждом куске мы пишем только примечания и источники сюжета.
notes = "Notes to explain the plot"
sources = "Explain the sources"
Еще раз большое спасибо, Ахмед!!
Pd: я использую "\\textsc{}"
чтобы создать пространство между заголовком, заметками и источниками.
Было бы неплохо обобщить это, чтобы использовать подзаголовки с множеством фигур на одном графике.
Решение от @akhmed было чрезвычайно полезным для меня. Мне нужно было сделать несколько дополнительных настроек, которые я передаю в качестве ответа (это было слишком долго для комментария).
- Во-первых, я хотел немного больше контролировать поля для заметки и нашел, что добавление среды мини-страниц помогло (
\\begin{minipage}
ниже установлен на 6 дюймов в ширину). Во-вторых, я добавил пару незначительных дополнений форматирования, установив размер шрифта и оставив выравнивание текста по левому краю (
\\small
а также\\begin{flushleft}
ниже).Наконец, для некоторых цифр я хотел использовать fig.pos="h!" или параметр figure position = "here" в Knitr / Latex, и мне потребовалась минута, чтобы понять, что этот хук перезаписывает этот параметр чанка, поэтому я вручную добавил его как
\\begin{figure}[h!]
,
Еще раз спасибо @akhmed за предложение этого решения.
knit_hooks$set(plot = function(x, options) {
paste("\n\\end{kframe}\n\\begin{figure}[h!]\n",
"\\includegraphics[width=\\maxwidth]{",
opts_knit$get("base.url"), paste(x, collapse = "."),
"}\n",
"\\begin{minipage}{6in}\\small\\begin{flushleft}Note: Lorem ipsum \\end{flushleft}\\end{minipage}",
"\\caption{", options$fig.cap, " \\label{", options$fig.lp, opts_current$get("label"), "}}\n",
"\n\\end{figure}\n\\begin{kframe}\n",
sep = '')
})