04 августа 2011

Создаем интерактивную веб-графику несколькими строками R-кода



В 2006 г. выступление профессора Ханса Рослинга на конференции "Технологии, Развелечения, Дизайн" (TED, Technology Entertainment Design) произвело своего рода революцию в способах интерактивной визуализации многомерных данных (см. также здесь). Речь идет об анимационных графиках, которые проф. Рослинг использовал в своей презентации для анализа социально-экономической ситуации в мире за последние 50 лет.

Пример графика такого типа приведен ниже. На нем отражена динамика продаж трех видов фруктов (Яблоки, Бананы, Апельсины) в двух регионах (Запад и Восток). Имеются обширные возможности для визуализации зависимостей между различными переменными. Например, мы можем выбрать переменную "Время" для отображения на оси абсцисс и "Затраты" на оси ординат, раскрасить "пузыри" на графике в соответствии с регионом (Color / Регион), прикрепить названия фруктов к каждому "пузырю" (меню Select), и посмотреть, что получается, нажав кнопку воспроизведения. Попробуйте разные сочетания, чтобы "прочувствовать" возможности этого инструмента.




Приведенный выше график был построен на основе таблицы данных Fruits, входящей в состав библиотеки googleVis. Подключаем эту таблицу к рабочей среде R и просматриваем ее содержимое:
data(Fruits)
Fruits




В оригинальной таблице все названия приведены на английском языке. Я заменил их на русскоязычные аналоги позднее непосредственно в html-коде графика.

Для создания графика была использована функция gvisMotionChart(). Она имеет четыре основных аргумента:
gvisMotionChart(data, idvar = "id", timevar="date", chartid),
где data - имя таблицы данных; idvar - имя номинальной переменной для которой строится график; chartid - аргумент, позволяющий присвоить графику уникальное имя (если оставить этот аргумент незадействованным, графику будет автоматически присвоено случайным образом подобранное имя). В нашем случае команда выглядела следующим образом:
M <- gvisMotionChart(Fruits, idvar = "Fruit", timevar = "Year")
Объект M является списком из трех списков (проверьте командой str(M)). Первые два элемента этого списка содержат информацию о типе графика (MotionChart) и его уникальное имя (chartid). Третий элемент списка наиболее интересен, поскольку он содержит html код графика. Этот третий элемент в свою очередь включает четыре других элемента: header ("шапка"), chart - непосредственно код графика, caption - подпись графика, и footer ("футер"). html-код графика можно легко извлечь командой
print(M, tag = "chart")
а затем скопировать и вставить на страницу вебсайта.

При помощи функций библиотеки googleVis можно создавать множество различных типов графиков, а также объединять их на одной странице. Для ознакомления с имеющимися возможностями выполните команду
demo(googleVis)
Рассмотренный в этом сообщении пример был заимствован из руководства пользователя googleVis.


Создано при помощи Pretty R на сайте inside-R.org

2 комментария :

Nachtjagtgeschwader комментирует...

Возникла проблема при использовании googleVis со своими данными:
Загрузил данные через консоль:
time <- c("12.15.2011 7:41:52", "12.15.2011 7:43:07", "12.15.2011 17:53:08", "12.15.2011 17:58:19", "12.15.2011 17:59:13", "12.15.2011 18:09:33", "12.15.2011 18:14:02", "12.15.2011 18:16:11", "12.15.2011 18:24:07", "12.15.2011 18:32:27", "12.15.2011 20:00:33", "12.15.2011 20:49:44", "12.15.2011 22:04:33", "12.15.2011 23:03:45", "12.15.2011 23:25:37", "12.16.2011 2:48:53", "12.16.2011 5:47:36", "12.16.2011 9:47:38", "12.16.2011 19:34:55", "12.16.2011 19:52:47", "12.16.2011 19:53:19", "12.16.2011 19:53:37", "12.16.2011 20:13:50", "12.16.2011 21:06:16", "12.16.2011 21:35:09", "12.16.2011 21:46:28", "12.16.2011 22:30:20", "12.16.2011 23:57:28", "12.17.2011 11:31:57", "12.17.2011 11:44:14", "12.17.2011 14:37:00", "12.18.2011 13:10:15", "12.19.2011 11:09:43", "12.19.2011 13:59:43", "12.19.2011 14:20:26", "12.19.2011 14:47:19", "12.19.2011 19:37:59", "12.20.2011 12:41:37", "12.20.2011 13:04:03", "12.20.2011 13:46:25")
choice <- c("Option 1", "Option 2", "Option 1", "Option 2", "Option 2", "Option 1", "Option 2", "Option 1", "Option 1", "Option 2", "Option 2", "Option 1", "Option 2", "Option 2", "Option 2", "Option 1", "Option 2", "Option 1", "Option 2", "Option 2", "Option 1", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2", "Option 1", "Option 1", "Option 2", "Option 1", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2", "Option 2")
data <- data.frame(time, choice)

Трансформировал формат "дата-время" в формат "дата":
data$time <- strptime(data$time, "%m.%d.%Y %H:%M:%S")
data$time <- as.Date(data$time, format="%Y-%m-%d %H:%M:%S")

Запустил библиотеку, попытался создать анимированный график:
library(googleVis)
M <- gvisMotionChart(data, idvar = "choice", timevar="time")

Получаю ошибку:
Error in gvisCheckMotionChartData(data, my.options) :
The data must have rows with unique combinations of idvar and timevar.
Your data has 40 rows, but idvar and timevar only define 10 unique rows.

Если вызвать fix(data), видно, что с матрицей данных все ОК, все40 кейсов определены правильно.
В чем проблема? Версия R - 2.13.2, googleVis - 0.2.12.

Сергей Мастицкий комментирует...

Nachtjagtgeschwader,
Проблема именно в том, о чем сказано в выданной программой ошибке. У Вас мало данных для построения анимированного графика. Есть только время и фактор с двумя уровнями. Отсутствует количественная переменная(-ные), измеренная(-ные) для КАЖДОГО из этих уровней в ОПРЕДЕЛЕННОЕ время.
Изучите внимательно пример с фруктами, приведенный в моей статье. Например, для 2008 года есть КОЛИЧЕСТВЕННЫЕ данные о продажах (Sales) и для апельсинов, и для яблок, и для бананов. Аналогичные данные есть для всех трех видов фруктов и для 2009, и для 2010 годов. В Вашей же таблице, например, для времени 2011-12-15 07:41:52 есть только указание уровня фактора choice (Option 1), но нет соответствующего измерения какой-либо количественной переменной. Хуже того, для этой временной точки у Вас нет информации по Option 2 - отсюда и выданная программой ошибка об отсутствии уникальных комбинаций для idvar и timevar.
Надеюсь, мой ответ оказался не слишком запутанным... Дайте знать, получилось ли разобраться с этой проблемой.

Отправить комментарий