【问题标题】:R: using rgl to generate 3d rotatable plots that can be viewed in a web browser?R:使用 rgl 生成可以在网络浏览器中查看的 3d 可旋转图?
【发布时间】:2011-12-01 14:45:16
【问题描述】:

在 R 统计包的世界中,rgl 允许我生成可以用鼠标旋转的 3d 图。有没有办法可以以便携式格式导出这些图,将它们加载到网络浏览器或其他第三方工具中并在那里旋转它们?我对 Web 浏览器解决方案特别感兴趣,因为这将允许我在内部 wiki 上共享绘图。

如果 rgl 不允许这样做,是否有其他库或策略可以让我完成此操作?

【问题讨论】:

  • +1 这是一个有趣的问题。我还没有玩过RStudio Server,但现在我很好奇它是否可以支持这一点。有没有其他人试一试服务器程序?
  • writeWebGL() 函数在 html 中导出。没有?

标签: r browser 3d rotation rgl


【解决方案1】:

要与网页中的图形动态交互,您需要某种类型的 java 或 flash 程序来进行交互,然后让 R 编写该程序可以理解的代码/数据。 This question and its answers 看起来是个不错的起点。

【讨论】:

    【解决方案2】:

    几百万年前(好吧,2005 年)我编写了 R 代码来以 Mathematica (!!) 图形格式转储图形基元,然后可以使用 LiveGraphics3D Java 插件嵌入和查看。我已经 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
    

    【讨论】:

      【解决方案3】:

      你可以试试vrmlgen 包。它将生成可以使用浏览器插件显示的 3d VRML 文件;你可以在VRML Plugin and Browser Detector找到一个插件。

      安装插件后,试试这个:

      require(vrmlgen)
      example(bar3d)
      

      注意:示例代码并没有在我的浏览器(RStudio、Win7、Chrome)中自动打开,因为路径被破坏了。您可能需要使用:

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

      如果您不想安装 VRML 插件,可以使用 X3DOM 代替。您需要converter,但您的用户应该能够仅使用(现代)浏览器查看它们。您可能需要修改以下代码以获取正确的路径:

      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)
      

      【讨论】:

      • 我会试试这个,但我更喜欢 Javascript(或者如果需要的话 flash)解决方案,它可以与大多数浏览器一起工作......
      • 这个答案有效。然而,对于那些关注库依赖的人来说,这是一个相当大的挑战(不想支持必须配置所有这些的客户)。我在 macOS 上成功了。 Ubuntu 10.04 有一个已弃用的库。我很乐观,我可以通过更多的努力让它在一些后期系列的 Ubuntu 中工作,但目前我已经失去动力了。
      • 还没有机会正确检查这一点,但它似乎是最好的答案,@Dieter Menne 的回答也支持它。
      • 是的,但看起来 Processing 确实值得一试。谢谢约翰,拿火星代替赏金。
      【解决方案4】:

      Pete 的建议是值得的。 wrl-detour 并不是真正需要的,使用 sprintf 和朋友生成 xml 文件相当容易。

      问题在于速度:作为比较,我进行了具有 17000 个球体(体素)的彩色胃 MRI,它在我的屏幕上使用 rgl 的响应非常好。

      当我将它移植到 x3dom 时,系统冻结了。一个包含 450 个球体的简化集:

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

      浏览器支持不一致。 x3dom 示例页面上的一些示例最适合(信不信由你)Internet Explorer + Flash 11。查看动态光示例。

      我的示例有效,但在 Firefox 7.0.1 上看起来很平。最好的总是 Chrome。

      稍后添加: 这是另一个例子:

      Stomach3D as Zip

      其中包含的 x3d 文件甚至可以使用 Instant Reality Viewer 显示板载图形。从它生成的 html 文件有时会加载,但无法旋转。

      【讨论】:

      • 离题了,但一般来说,如果你将体素绘制为体素,而不是球体,它会更快。 :)
      • 正确;如果您使用盒子而不是球体,情况也是如此。我使用后者是因为当我第一次在 rgl 中尝试使用球体和镜面反射时,老板非常喜欢它,所以我们保留了它。规格出售。
      • 我发现了一些对体素 web3d.org/x3d/specifications/…> 的引用,但是我如何将其转换为 x3d/x3dom?
      • 这些链接不再有效。
      • 太糟糕了,在我不得不移动到另一台服务器后,我没有备份这些文件。你可以看看menne-biomed.de/uni/3dmenne-biomed.de/swallow/jswallow3d.html
      【解决方案5】:

      为了获得最大的灵活性,我很幸运地使用了Processing。它最初是用 java 编写的,但现在已经稳定地移植到 javascript,并且更多地是实验性地移植到 python 甚至其他一些。

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

      它使用 HTML5 &lt;canvas&gt; 元素即时处理您的处理代码。您可以链接到另一个文件中的可视化代码,也可以将其直接写入您的 html 文件(让我想起了 Sweave!)。

      此外,还有大量在线开源示例资源。例如:

      http://openprocessing.org

      最后,我整理了一个要点来演示基本设置。只需将processing.js 文件下载到与 gist 相同的文件夹中,然后打开浏览器即可。

      https://gist.github.com/1295842

      看起来像这样:

      【讨论】:

        【解决方案6】:

        对于一个简单的解决方案,试试这个...

        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=""))
        

        在 Firefox 或支持 HTML5 和 WebGL 的类似浏览器中打开 index.html 文件

        【讨论】:

        • 要直接运行,可以用writeWebGL(dir=tempdir(), width=700); browseURL(file.path(tempdir(), 'index.html')) 代替@mark 提供的底线。
        【解决方案7】:

        rgl 包现在具有 rglwidget 函数,这可能是创建 rgl 图小部件的最简洁和最简单的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-23
          • 2023-01-08
          • 2010-10-27
          • 2021-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多