R: использование rgl для создания 3D-поворотных графиков, которые можно просматривать в веб-браузере?

#r #browser #3d #rotation #rgl

#r #браузер #3D #вращение #rgl

Вопрос:

В пакете world of R statistics rgl позволяет мне создавать 3D-графики, которые я могу вращать с помощью мыши. Есть ли способ экспортировать эти графики в переносимый формат, загрузить их в веб-браузер или другой сторонний инструмент и повернуть их там? Меня особенно интересует решение для веб-браузера, поскольку это позволит мне делиться графиками во внутренней вики.

Если rgl не позволяет этого, существуют ли другие библиотеки или стратегии, которые позволили бы мне выполнить это?

Комментарии:

1. 1 Это интересный вопрос. Я еще не играл с RStudio Server , но теперь мне интересно, может ли он это поддерживать. Кто-нибудь еще запустил серверную программу?

2. writeWebGL() Функция rgl экспорта пакета в html. Нет ?

Ответ №1:

Вы могли бы попробовать vrmlgen пакет. Он будет создавать файлы 3d VRML, которые можно отображать с помощью плагина для браузера; вы можете найти плагин в плагине VRML и детекторе браузера.

После установки плагина попробуйте следующее:

 require(vrmlgen)
example(bar3d)
  

ПРИМЕЧАНИЕ: пример кода не открылся автоматически в браузере для меня (RStudio, Win7, Chrome), потому что путь был искажен. Возможно, вам потребуется использовать:

 require(stringr)
browseURL(str_replace_all(file.path(outdir, 'barplot.html'), fixed('\'), '/'))
  

Если вы не хотите устанавливать плагин VRML, вы можете использовать вместо этого X3DOM. Вам понадобится конвертер, но ваши пользователи должны иметь возможность просматривать их только с помощью (современного) браузера. Возможно, вам придется изменить следующий код, чтобы получить правильные пути:

 setwd(outdir)
aopt <- 'C:/PROGRA~1/INSTAN~1/bin/aopt' # Path to conversion program
vrml <- 'barplot.wrl'
x3dom <- 'barx.html'
command <- paste(aopt, '-i', vrml, '-N', x3dom)
system(command)
# LOG   Avalon   Init: 47/616, V2.0.0 build: R-21023 Jan 12 2011
# LOG   Avalon   Read url
# LOG   Avalon   Read time: 0.074000
# ============================================
# Call: writeHTML with 1 param 
# Write raw-data to barx.html as text/html
# WARNING   Avalon   Run NodeNameSpace "scene" destructor and _nodeCount == 3
# WARNING   Avalon   Try to remove nodes from parents
# WARNING   Avalon   PopupText without component, cannot unregister
# WARNING   Avalon   Avalon::exitSystem() call and node/obj left: 0/3331
browseURL(file.path(outdir, 'barx.html'))
setwd(curdir)
  

Комментарии:

1. Я попробую это, но я бы предпочел решение на Javascript (или, при необходимости, flash), которое будет работать с большинством браузеров…

2. Этот ответ работает. Однако для тех, кто следит за зависимостями библиотеки, это стало довольно сложной задачей (не хотелось бы поддерживать клиентов, которым приходилось все это настраивать). Мне это удалось на macOS. В Ubuntu 10.04 была устаревшая библиотека. Я настроен оптимистично, что смогу заставить его работать в некоторых последних версиях Ubuntu с большими усилиями, но на данный момент я выдыхаюсь.

3. у вас не было возможности проверить это должным образом, но, похоже, это лучший ответ из всех, и ответ @Dieter Menne также поддерживает его.

4. Да, но, похоже, обработка действительно стоит попробовать. Спасибо, Джон, возьми Марс вместо Баунти.

Ответ №2:

Для простого решения попробуйте это…

 x <- sort(rnorm(1000))
y <- rnorm(1000)
z <- rnorm(1000)   atan2(x,y)

plot3d(x,y,z, 
       col=rainbow(1000),
       type = "s",
       size=1,
       xlab = "x", 
       ylab = "y", 
       zlab = "z",
       box=T)

# This writes a copy into temporary directory 'webGL', and then displays it
browseURL(paste("file://", writeWebGL(dir=file.path("C:/Your-Directory-Here/", "webGL"), width=700), sep=""))
  

откройте index.html файл в Firefox или аналогичном браузере, поддерживающем HTML5 и WebGL

Комментарии:

1. Чтобы выполнить это напрямую, можно заменить writeWebGL(dir=tempdir(), width=700); browseURL(file.path(tempdir(), 'index.html')) нижнюю строку, указанную @mark .

Ответ №3:

Предложение Пита стоит вознаграждения. Обходной путь wrl на самом деле не нужен, довольно просто сгенерировать xml-файл с помощью sprintf и друзей.

Проблема в скорости: для сравнения, у меня была МРТ желудка с цветовым кодом с 17000 сферами (для вокселей), которая была довольно отзывчивой на моем экране с помощью rgl.

Когда я портировал его на x3dom, система зависла. Работает уменьшенный набор из 450 сфер:

http://www.menne-biomed.de/uni/x3dsample.html

Поддержка браузеров несовместима. Некоторые примеры на странице примеров x3dom лучше всего работают с (хотите верьте, хотите нет) Internet Explorer Flash 11. Проверьте пример динамического освещения.

Мой пример работает, но выглядит плоским в Firefox 7.0.1. Лучшим всегда является Chrome.

Добавлено позже: вот еще один пример:

Stomach3D как Zip

Содержащийся в нем файл x3d может отображаться даже с встроенной графикой с помощью программы Instant Reality Viewer. Сгенерированный из него HTML-файл иногда загружается, но не может быть повернут.

Комментарии:

1. не по теме, но в целом, если вы строите воксели как воксели, а не сферы, это будет намного быстрее. 🙂

2. Правильно; то же самое верно, если вы используете прямоугольники вместо сфер. Я использовал последнее, потому что, когда я впервые попробовал его со сферами и зеркальными отражениями в rgl, боссу это очень понравилось, поэтому мы оставили его. Спецификации продаются.

3. Я нашел несколько ссылок на воксели < web3d.org/x3d/specifications /… >, но как мне перевести это в x3d/ x3dom?

4. Эти ссылки больше не активны.

5. Жаль, я не сделал резервную копию этих файлов после того, как мне пришлось перейти на другой сервер. Вы могли бы взглянуть на menne-biomed.de/uni/3d и menne-biomed.de/swallow/jswallow3d.html вместо этого.

Ответ №4:

Для максимальной гибкости мне очень повезло с использованием Processing. Изначально он был написан на java, но теперь стабильно портирован на javascript, и более экспериментально на python и даже на несколько других.

http://processingjs.org
http://processing.org

Он использует элемент HTML5 <canvas> для обработки вашего кода обработки на лету. Вы можете либо сослаться на свой код визуализации в другом файле, либо записать его прямо в свой HTML-файл (напоминает мне Sweave!).

Кроме того, в Интернете есть огромный ресурс примеров с открытым исходным кодом. Например:

http://openprocessing.org

Наконец, вот суть, которую я собрал, чтобы продемонстрировать базовую настройку. Просто загрузите processing.js поместите файл в ту же папку, что и gist, и откройте свой браузер.

https://gist.github.com/1295842

Это будет выглядеть так:

введите описание изображения здесь

Ответ №5:

Пару миллионов лет назад (ОК, 2005) я написал R-код для выгрузки графических примитивов в графическом формате Mathematica (!!), который затем можно было встроить и просмотреть с помощью Java-плагина LiveGraphics3D. Я не пытался использовать его в течение 6 лет, но я мог бы попытаться воскресить его, если бы был интерес.

PS вот результаты help(package="LG3d") :

 get.live.jar            Download live.jar Java archive
LG.display              Display Live3D graphics in a browser
LG.html.head            header and footer files for LiveGraphics HTML
                        files
LGmobius                Draw a 3D mobius strip
LG.open                 open and close LiveGraphics3D files
LG.plot.profiles        Plot likelihood surface   profiles using
                        Live3D
LGtorus                 Draw a torus in LG graphics system
LGtoruswrap             Utility functions for LGtorus
mma.brace               Low-level graphics primitives for
                        LiveGraphics3D
mma.edge                change edge style
mma.persp               Output a perspective plot to a LiveGraphics3D
                        file
mma.point               Medium-level graphics primitives for
                        LiveGraphics3D
mma.polygon             draw a Mma/LG3d polygon
  

Ответ №6:

rgl Теперь в пакете есть rglwidget функция, которая, вероятно, является самым простым и простым способом создания виджетов графиков rgl.