Уточнение: у вас работает, но только со старыми версиями R? К сожалению, с 2.15 не работает вообще.

ой вопрос: есть ли способ построить график из R в файле PDF и включить всплывающие подсказки?

 Joris Meys14 янв. 2011 г., 15:16
Это может представлять интерес:jackman.stanford.edu/blog/?p=1507 Это SVG, но это что-то.
 Sacha Epskamp20 февр. 2013 г., 22:27
Я думаю, что tikzdevice все еще можно установить через rforge?
 petrelharp20 февр. 2013 г., 18:06
Отличные ответы, но ни один из них не актуален - ни tikzDevice, ни pdf2 не поддерживаются. Любой текущий способ сделать это?

Ответы на вопрос(3)

//r-forge.r-project.org/R/?group_id=193). Вы можете просто включить «всплывающее окно» в обычной текстовой команде. Это не актуально по состоянию на 2.14, но я думаю, что он вернется к этому в ближайшее время.

текст (x, y, «печатный текст», popup = «текст всплывающей подсказки»)

 petrelharp19 февр. 2013 г., 21:04
Уточнение: у вас работает, но только со старыми версиями R? К сожалению, с 2.15 не работает вообще.
Решение Вопроса

есть ли способ построить график из R в файле PDF и включить всплывающие подсказки?

Там всегда есть способ. Но дьявол кроется в деталях, поэтому реальный вопрос: готовы ли вы запачкать руки?

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

Теперь единственный известный мне способ генерации и компиляции необработанных операторов PDF - это создание документа с использованием TeX. Есть определенно другие способы сделать это, но это тот, с которым я знаком. В следующих примерах используется графическое устройство, которое я и Кэмерон Бракен написали,tikzDevice, для рендеринга R графики в код LaTeX. У tikzDevice есть предварительная поддержка для вставки произвольного кода LaTeX в поток вывода графики черезtikzAnnotate функция --- мы будем использовать это, чтобы выбросить выноски PDF на график.

Шаги включают в себя:

Настройте макрос LaTeX для генерации команд PDF, необходимых для создания выноски.Установите функцию R, которая используетtikzAnnotate вызвать макрос LaTeX в определенных точках графика.???Прибыль!

В следующих примерах одно серьезное предостережение прикреплено к шагу 2.Используемые вычисления координат будут работать только с базовой графикой, а не с сеточной графикой, такой как ggplot2.

Простые подсказкиШаг 1

TikzDevice позволяет вам создавать R графику, которая включает в себя выполнение произвольных команд LaTeX. Обычно это делается для вставки таких вещей, как$\alpha$ в сюжетные заголовки, чтобы генерировать греческие буквы, α или сложные уравнения. Здесь мы собираемся использовать эту функцию для вызова некоторого необработанного PDF вуду.

Любые макросы LaTeX, которые вы хотите быть доступными во время создания графики tikzDevice, должны быть определены заранее, установивtikzLatexPackages вариант. Здесь мы собираемся добавить некоторые вещи к этой декларации:

require(tikzDevice)  # So that default options are set
options(tikzLatexPackages = c( 
  getOption('tikzLatexPackages'),  # The original contents: required stuff
    # Avert your eyes for a sec, all will be explained below
    "\\def\\tooltiptarget{\\phantom{\\rule{1mm}{1mm}}}",
    "\\newbox\\tempboxa\\setbox\\tempboxa=\\hbox{}\\immediate\\pdfxform\\tempboxa \\edef\\emptyicon{\\the\\pdflastxform}",
    "\\newcommand\\tooltip[1]{\\pdfstartlink user{/Subtype /Text/Contents  (#1)/AP <</N \\emptyicon\\space 0 R >>}\\tooltiptarget\\pdfendlink}"
))

Если кто-то, кто заботится о читабельности, записал бы всю эту бессмысленную чепуху в виде кода LaTeX, это выглядело бы так:

\def\tooltiptarget{\phantom{\rule{1mm}{1mm}}}

\newbox\tempboxa
\setbox\tempboxa=\hbox{} 
\immediate\pdfxform\tempboxa 
\edef\emptyicon{\the\pdflastxform}

\newcommand\tooltip[1]{%
  \pdfstartlink user{%
    /Subtype /Text
    /Contents  (#1)
    /AP <<
      /N \emptyicon\space 0 R
    >>
  }%
  \tooltiptarget%
  \pdfendlink%
}

Для тех программистов, которые никогда не гуляли по дикой стороне и не занимались «программированием» в TeX, вот пошаговое решение для приведенного выше кода (в любом случае, как я понимаю, TeX может стать очень странным - особенно когда ты в траншеи спускаешься с ним)

Линия 1: Определить объект,tooltiptarget, который невидим (фантом) и представляет собой прямоугольник 1 мм х 1 мм (правило). Это будет область экрана, которую мы будем использовать для обнаружения наведения мыши.

Строка 2: Создайте новую рамку, которая похожа на «фрагмент страницы» набранного материала. Может содержать почти все, включая другие поля (вроде списка R). Назови этоtempboxa.

Строка 3: Назначить содержимоеtempboxa содержать пустое поле, которое размещает его содержимое с помощью горизонтальной компоновки (что неважно, возможно, использовался vbox или другой блок).

Строка 4: Создайте PDF-форму XObject, используя содержимоеtempboxa, Форма XObject может использоваться файлами PDF для хранения графики, например логотипов, которые можно использовать снова и снова. Здесь мы создаем «пустой значок», который мы можем использовать позже, чтобы сократить визуальный беспорядок. TeX откладывает операции вывода, такие как запись объектов в файл PDF, до тех пор, пока не будут выполнены определенные условия - например, заполнение страницы. Немедленно убедитесь, что эта операция не отложена.

Строка 5: Эта строка захватывает целочисленное значение, которое служит ссылкой на только что созданный PDF-объект XObject, и присваивает ему имяemptyicon.

Строка 6: Начинает определение нового макроса с именем tooltip, который принимает 1 аргумент, который упоминается в теле макроса как#1, Каждая строка в макросе заканчивается символом комментария,%чтобы TeX не замечал новые строки, которые были добавлены для удобства чтения (новые строки могут иметь странные эффекты внутри макросов).

Строка 7: Выводить сырые команды PDF (pdfstartlink). Это начинает создание нового объекта аннотации PDF (\Type \Annot) из которых существует около 20 различных подтипов - среди них есть гиперссылки. Каждая следующая за этим строка содержит необработанную PDF-разметку с парой макросов TeX.

Строка 8: Объявите подтип аннотации, который мы будем использовать. Здесь я иду с простой текстовой аннотацией, такой как комментарий или заметка.

Строка 9: Объявите содержание аннотации. Это будет содержание нашей подсказки и установлено в#1, аргумент макроса всплывающей подсказки.

Строки 10-12: Обычно текстовые аннотации помечаются значком, например, заметкой, чтобы выделить их местоположение в тексте. Такое поведение вызовет визуальный беспорядок, если мы позволим ему разбрызгивать маленькие заметки по всем нашим графикам. Здесь мы используем массив внешнего вида (\AP << >>) установить «нормальную» иконку аннотации (\N) будет пустой значок, который мы создали ранее. Целое число, которое мы сохранили вemptyicon вместе с0 R формирует ссылку на Form XObject, который мы сделали в строке 4, используя пустое поле.

Строка 14: Если бы мы делали нормальную гиперссылку, то здесь, куда бы шел текст / изображение / все, что бы послужило телом ссылки. Вместо этого мы вставляемtooltiptargetнаш невидимый фантомный объект, который не появляется на экране, но реагирует на наведение мыши.

Шаг 2

Хорошо, теперь, когда мы рассказали LaTeX, как создавать всплывающие подсказки, пришло время сделать их пригодными для использования из R. Это включает написание функции, которая будет принимать координаты на нашем графике, такие как (1,1), и преобразовывать их в canvas или координаты "устройства". В случае tikzDevice требуемое измерение - это «точки TeX» (1 / 72,27 дюйма) от абсолютного нижнего левого угла области построения. К счастью для базовой графики, есть удобные функции, чтобы рассчитать это для нас. Грид-графика работает по-другому, поэтому подход, использованный в примерах, для них не сработает.

Последняя задача для нашей функции R - это вызовtikzAnnotate вставить TikZ "узел" в выходной поток, который расположен в координатах, которые мы вычислили. Узлы могут содержать произвольные команды TeX, в этом случае мы будем вызыватьtooltip.

Вот функция R, которая содержит вышеуказанную функциональность:

place_PDF_tooltip <- function(x, y, text){

  # Calculate coordinates
  tikzX <- round(grconvertX(x, to = "device"), 2)
  tikzY <- round(grconvertY(y, to = "device"), 2)

  # Insert node
  tikzAnnotate(paste(
    "\\node at (", tikzX, ",", tikzY, ") ",
    "{\\tooltip{", text, "}};",
    sep = ''
  ))

  invisible()

}
Шаг 3

Попробуйте это на сюжете:

# standAlone creates a complete LaTeX document. Default output makes
# stripped-down graphs ment for inclusion in other LaTeX documents
tikz('tooltips_ahoy.tex', standAlone = TRUE)
plot(1,1)
place_PDF_tooltip(1,1, 'Hello, World!')
dev.off()

require(tools)
texi2dvi('tooltips_ahoy.tex', pdf = TRUE)
Шаг 4

Вот результат (скачать PDF):

Расширенные подсказкиШаг 1

Итак, теперь, когда у нас есть простые подсказки, почему бы не провернуть их до 11? В предыдущем примере мы использовали пустойhbox чтобы избавиться от значка всплывающей подсказки. Но что, если бы мы поместили что-то в это поле, например, текст или рисунок? А что, если бы был способ сделать так, чтобы значок появлялся только во время событий наведения мыши?

Следующий макрос TeX немного грубоват, но это показывает, что это возможно:

\usetikzlibrary{shapes.callouts}
\tikzset{tooltip/.style = {
  rectangle callout, 
  draw,
  callout absolute pointer = {(-2em, 1em)}
}}

\def\tooltiptarget{\phantom{\rule{1mm}{1mm}}}    
\newbox\tempboxa

\newcommand\tooltip[1]{%
  \def\tooltipcallout{\tikz{\node[tooltip]{#1};}}%

  \setbox\tempboxa=\hbox{\phantom{\tooltipcallout}}%
  \immediate\pdfxform\tempboxa%
  \edef\emptyicon{\the\pdflastxform}%

  \setbox\tempboxa=\hbox{\tooltipcallout}%
  \immediate\pdfxform\tempboxa%
  \edef\tooltipicon{\the\pdflastxform}%

  \pdfstartlink user{%
    /Subtype /Text
    /Contents  (#1)
    /AP <<
      /N \emptyicon\space 0 R
      /R \tooltipicon\space 0 R
    >>
  }%
  \tooltiptarget%
  \pdfendlink%
}

Следующие модификации были сделаны по сравнению с простой выноской.

shapes.callouts загружена библиотека, которая содержит шаблоны для использования TikZ при рисовании выносок.

A tooltip определен стиль, который содержит некоторый графический шаблон TikZ. Он определяет прямоугольное поле выноски, которое должно быть видимым (draw).callout absolute pointer бизнес - это хак, потому что к этому моменту у меня было слишком много пива, чтобы понять, как размещать значки аннотаций с использованием динамически генерируемых примитивов PDF. Это основывается на привязке значков по умолчанию в их верхнем левом углу и, таким образом, тянет указатель поля выноски к этому месту. В результате поля всегда будут отображаться в правом нижнем углу указателя и, если текст выноски достаточно длинный, они не будут выглядеть правильно.

Внутри макроса подсказка генерируется с помощью однократногоtikz Команда, которая вставлена ​​вtooltipcallout макро. Форма XObject генерируется изtooltipcallout и назначенtooltipicon.

emptyicon также динамически генерируется путем оценкиtooltipcallout Внутриphantom, Это необходимо, потому что размер значка по умолчанию, по-видимому, устанавливает область просмотра, доступную для значка ролловера.

При создании команд PDF новая строка добавляется в/AP массив,/R для ролловера, который использует XObject, на который ссылаетсяtooltipicon.

Готовая к употреблению версия R:

require(tikzDevice)
options(tikzLatexPackages = c( 
  getOption('tikzLatexPackages'),
  "\\usetikzlibrary{shapes.callouts}",
  "\\tikzset{tooltip/.style = {rectangle callout,draw,callout absolute pointer = {(-2em, 1em)}}}",
  "\\def\\tooltiptarget{\\phantom{\\rule{1mm}{1mm}}}",
  "\\newbox\\tempboxa",
  "\\newcommand\\tooltip[1]{\\def\\tooltipcallout{\\tikz{\\node[tooltip]{#1};}}\\setbox\\tempboxa=\\hbox{\\phantom{\\tooltipcallout}}\\immediate\\pdfxform\\tempboxa\\edef\\emptyicon{\\the\\pdflastxform}\\setbox\\tempboxa=\\hbox{\\tooltipcallout}\\immediate\\pdfxform\\tempboxa\\edef\\tooltipicon{\\the\\pdflastxform}\\pdfstartlink user{/Subtype /Text/Contents  (#1)/AP <</N \\emptyicon\\space 0 R/R \\tooltipicon\\space 0 R>>}\\tooltiptarget\\pdfendlink}"
))
Шаг 2

Код R-уровня не изменился.

Шаг 3

Давайте попробуем немного более сложный график:

tikz('tooltips_with_callouts.tex', standAlone = TRUE)

x <- 1:10
y <- runif(10, 0, 10)
plot(x,y)
place_PDF_tooltip(x,y,x)

dev.off()

require(tools)
texi2dvi('tooltips_with_callouts.tex', pdf = TRUE)
Шаг 4

Результат (скачать PDF):

Как видите, существует проблема с отображаемой подсказкой и выноской. настройка\Contents () так что подсказка с пустой строкой ничего не поможет. Возможно, это можно решить с помощью другого типа аннотации, но сейчас я не собираюсь тратить на это больше времени.

Предостережения

Многие команды TeX содержат обратную косую черту, вам потребуется удвоить обратную косую черту при выражении вещей в R-коде.

Некоторые символы являются особенными для TeX, например_, ^, %, полный список здесь, вам нужно убедиться, что они правильно экранированы при использовании tikzDevice.

Хотя предполагается, что PDF превосходит HTML в том смысле, что он обеспечивает равномерное отображение на разных платформах, ваш пробег будет значительно различаться в зависимости от того, какой просмотрщик используется. Снимки экрана были сделаны в Acrobat 8 ​​на OS X. Предварительный просмотр также выполнил сносную работу, но не отрисовывал ролловер. В Linux xpdf ничего не рендерил, и okular отображал всплывающую подсказку, но не подавлял значок всплывающей подсказки и отображал значок с изображением акции, который выглядел немного странным в середине графика.

Альтернативные реализации

cooltooltips а такжеfancytooltips являются пакетами LaTeX, которые предоставляют функциональность всплывающей подсказки, которую, вероятно, можно использовать из tikzDevice. Некоторые идеи, использованные в приведенных выше примерах, были взяты из cooltooltips.

Заключительные мысли

Это стоило того? Ну, к концу дня я выучил две вещи:

Я не эксперт PDF и мне пришлось поискать пару списков рассылки и переварить некоторые части спецификации страницы 700+, чтобы даже ответить на вопрос "это возможно?" не говоря уже о том, чтобы придумать реализацию.

Я не эксперт SVG и все же я знаю, что всплывающие подсказки в SVG - это не вопрос "возможно ли это?" скорее "как сексуально вы хотите, чтобы это выглядело?».

Учитывая это наблюдение, я говорю, что для PDF настало время уйти в закат и взять с собой спецификации на 700 страниц. Нам нужен новый язык описания разметки страницы и лично я надеюсьSVG Print будет достаточно полным, чтобы сделать работу. Я бы даже принялAdobe Mars если спецификация достаточно доступна. Просто предоставьте нам формат на основе XML, который может использовать всю мощь современных библиотек JavaScript, и тогда могут начаться некоторые реальные инновации. Бэкэнд LuaTeX был бы хорошим бонусом.

РекомендацииtikzDevice: Устройство для вывода R графики в виде кода LaTeX.comp.text.tex: Источник большого понимания эзотерических деталей TeX. Сообщения отГерберт Восс а такжеМайкрофт предоставленные идеи реализации.Руководство pdfTeX: Источник информации о командах TeX, которые могут генерировать сырой PDF-код, такой как\pdfstartlinkTeX по теме: Руководство по низкоуровневым деталям TeX, например, как\immediate на самом деле работает.Спецификация Adobe PDF: Логово деталей относительно примитивов PDF.Руководство TikZ: Вполне возможно, лучший пример документации с открытым исходным кодом, когда-либо написанной.

не PDF, но вы могли бы включить всплывающие подсказки (среди охер) в формате SVG сSVGAnnotation или жеRSVGTipsDevice пакет.

 daroczig14 янв. 2011 г., 15:46
@Sacha Epskamp - извини, я понятия не имею.
 Sacha Epskamp14 янв. 2011 г., 15:18
Спасибо, но я уже знаком с SVGTipsDevice. Мне было интересно узнать о pdf, потому что я предпочитаю этот формат, и этот формат позволяет всплывающие подсказки

Ваш ответ на вопрос