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 = '')
    })
Другие вопросы по тегам