Идеологически верная графика

Несмотря на своё разнообразие, графическая система в R построена на основе строгих правил. Выбор типа графика, основных цветов и символов для изображения точек, расположение подписей и т.д. был тщательно продумано создателями. Одним из ключевых для R исследований является книга Уильяма Кливленда «Элементы графической обработки данных». Многие его идеи были осуществлены именно в S-PLUS, а затем и в R. Например, Кливленд нашёл, что традиционные «столбчатые» графики очень плохо воспринимаются, особенно когда речь идёт о близких значениях данных, и предложил им на замену: «точечные диаграммы». Вот так они реализованы в R :

> dotchart(Titanic[,,"Adult","No"],

Идеологически верная графика - student2.ru

Рис. 2.3. Точечная диаграмма. График-решётка

+ main=’Погибшие␣на␣"Титанике"’)

Встроенная таблица данных Titanic — это четырёхмерная матрица, которая отражает статистику по возрастным группам, типу билета и полу. Особенно активно Кливленд (и далеко не только он) возражал против использования трёхмерных графиков и так называемых «пирогов». Поначалу «пирожных» графиков в R вовсе не было3, причём по принципиальным соображениям. Трёхмерных графиков в R и сейчас немного (правда, есть особый пакет rgl, который позволяет строить такие графики на базе OpenGL), а если Вы хотите узнать, как меняется поведение двух переменных по отношению к третьей, R предлагает так называемые «Trellis graphs» или графики-решётки:

> coplot(log(Volume) ~ log(Girth) | Height, data = trees)

При выполнении этой команды на рисунке отображается как зависит объём древесины от объёма кроны (в логарифмической шкале) у деревьев различной высоты. Действительно, такое представление гораздо эффективнее трёхмерного. Странно, что распространённые пакеты статобработки почти не используют графики-решётки, хотя их наличие неоднократно называлось одной из главных при- чин коммерческого успеха S-PLUS.

Интерактивность

Интерактивная графика позволяет выяснить, где именно на графике расположены нужные Вам точки и разместить объект (скажем, подпись) в нужное место, а также проследить «судьбу» одних и тех же точек на разных графиках. Кроме того, если данные многомерные, то можно вращать облако точек в плоскости разных переменных с тем чтобы выяснить структуру данных. Ещё несколько лет назад пришлось бы написать, что здесь вместо R следует воспользоваться другими аналитическими инструментами, но R развивается так быстро, что все эти методы теперь доступны, причём в нескольких вариантах. Например, так можно добавлять подписи в указанную мышкой область графика:

> plot(1:20)

> text(locator(), "Моя␣любимая␣точка", pos=4)

После того как введена вторая команда, надо щёлкнуть левой кнопкой мыши на выбранной точке в графике, а затем уже без разницы где щёлкнуть правой кнопкой мыши. Интерактивная графика других типов реализована командой identify(), а также пакетами rggobi, TeachingDemos и iplot.

Как сохранять результаты

Начинающие работу с R обычно просто копируют результаты работы (скажем, данные тестов) из консоли R в текстовый файл. И действительно, на первых порах этого может оказаться достаточно. Однако рано или поздно возникает необходимость сохранять объёмные объекты (например, таблицы данных), созданные в течении работы. Можно использовать уже упомянутый в начале статьи внутренний бинарный формат, но это не всегда удобно. Лучше всего сохранять таблицы данных в виде текстовых таблиц, которые потом можно будет открывать другими приложениями или текстовыми редакторами. Для этого служит команда write.table():

> write.table(file="trees.csv", trees, + row.names=F, sep=";", quote=F)

В текущую рабочую директорию будет записан файл trees.csv, образованный из встроенной в R таблицы данных trees. А что, если надо записать во внешний файл результаты выполнения команд? В этом случае используется команда sink():

> sink("1.txt", split=T)

> 2+2 [1] 4

> sink()

В этом случае во внешний файл запишется строчка «[1] 4», то есть результат выполнения команды. Сама команда записана не будет, а если хочется, чтобы она была записана, то придётся ввести что-то вроде:

> print("2+2") [1] "2+2"

> 2+2 [1] 4

то есть повторять каждую команду два раза. Для сохранения истории команд служит команда savehistory(), а для сохранения всех созданных объектов — save.image(). Последняя может оказаться также полезной для сохранения про- межуточных результатов работы, если не уверены в стабильности работы компьютера.

2.4. Мастера отчётов

Таблицы, созданные в R, можно сохранять и в более «приличном» виде, например, в форматах L ATEX ([1]) или HTML, при помощи пакета xtable. Естественно, хочется пойти дальше, и сохранять в каком-нибудь из этих форматов вообще всю R-сессию. Для HTML такое возможно, если использовать пакет R2HTML с CRAN:

> library(R2HTML)

> dir.create("example")

> HTMLStart("example") HTML

> 2+2 HTML

> plot(1:20) HTML

> HTMLplot() HTML

> HTMLStop()

>

В рабочей директории будет создана поддиректория example и туда будут записаны HTML-файлы, содержащие полный отчёт о текущей сессии, в том числе и созданный график. Можно пойти и ещё дальше. Что, если создать файл, который будет содержать код R, перемешанный с текстовыми комментариями, и потом «скормить» этот файл R так, чтобы фрагменты кода заменились на результат их исполнения? Идея эта называется «literate programming» (грамотное программирование) и принадлежит Дональду Кнуту, создателю TEX. В случае R такая система используется для автоматической генерации отчётов — «фичи», которая фактически отсутствует в остальных статистических пакетах и делает R поистине незаменимым. Для создания подобного отчёта, для начала, надо набрать простой файл c L ATEX-подобной структурой и назвать его, например, test-Sweave.Rnw:

\documentclass[a4paper,12pt]{scrartcl} % Стандартная шапка для \LaTeX-документа \usepackage[T2A]{fontenc} % В зависимости от используемой локали вместо utf8 нужно %поставить cp1251 или koi8-r \usepackage[utf8]{inputenc} \usepackage[english,russian]{babel} \usepackage{indentfirst}

\title{Тест Sweave} \author{А.В.\,Тор} \begin{document} % Тело документа \maketitle

\textsf{R} как калькулятор: <<echo=TRUE,print=TRUE>>= 1 + 1 1 + pi sin(pi/2) @

Картинка: <<fig=TRUE>>= plot(1:20) @

\end{document}

Затем этот файл необходимо обработать в R :

> Sweave("test-Sweave.Rnw") Writing to file test-Sweave.tex Processing code chunks ... 1 : echo print term verbatim 2 : echo term verbatim eps pdf

You can now run LaTeX on ’test-Sweave.tex’

При этом создаётся готовый L ATEX-файл test-Sweave.tex. И, наконец, при помощи latex/dvips или pdflatex получить результирующий файл:

=> latex test-Sweave.tex => dvips test-Sweave.dvi => gv test-Sweave.ps

Идеологически верная графика - student2.ru

Рис. 2.5. Пример отчёта полученного с помощью команды Sweave

# или => pdflatex test-Sweave.tex => acroread test-Sweave.pdf

Такой отчёт можно расширять, шлифовать, изменять исходные данные, и при этом усилия по оформлению практически сводятся на нет. Если есть желание, чтобы код R набирался моноширинным шрифтом, то в L ATEX-преамбуле Rnw- файла следует добавить строчку:

\usepackage[noae]{Sweave}

Исходный код и авторскую документацию профессора Фридриха Лайша (Friedrich Leisch) можно найти здесь: http://www.ci.tuwien.ac.at/~leisch/Sweave/. Есть и другие системы генерации отчётов, например, уже упомянутый пакет R2HTML умеет производить похожие отчёты в HTML. Есть пакет brew, который позволяет создавать автоматические отчёты в текстовой форме (разумеется, без графиков), и совсем новый пакет odfWeave, который может работать с ODF (формат OpenOffice.org).

Наши рекомендации