【问题标题】:Data graphing with html [closed]使用 html 进行数据绘图 [关闭]
【发布时间】:2011-09-24 01:47:06
【问题描述】:

目标是每隔几秒更新一次且不需要刷新页面的折线图(它将从服务器上更新的单独文件中获取信息)。是否有任何 JavaScript 库(JQuery 除外)可以使这变得容易?谁能在网页上展示一个示例?

数据以固定的时间间隔更新。如果可能的话,最好只使用 CSS HTML5 和 javascript。

【问题讨论】:

标签: javascript jquery html canvas html5-canvas


【解决方案1】:

几件事可能对您有所帮助:

Canvas Express 是一个强大的图表库:http://canvasxpress.org/

您可以在此处找到有关滚动您自己的基于方程的图表的教程:http://www.html5canvastutorials.com/labs/html5-canvas-graphing-an-equation/

使用画布解决方案非常简单,您可以使用 ajax 检索图形的周期性数据,并在每次检索新数据时重新绘制图形。
由于都是客户端,因此您无需刷新页面。

如果您熟悉 javascript 和 ajax,那么这将是一个中等难度。如果您不这样做,那么您可能需要在 Stack Ovreflow 上发布更多问题,以帮助您解决您遇到的问题。

【讨论】:

  • 感谢它正是我所需要的
【解决方案2】:

您从服务器获取数据,更新您以前可用的数据集,然后可能使用免费提供的库之一来绘制图形(例如:http://www.rgraph.net

您可能需要考虑的事项:如果您的图表代表一种状态,则仅使用 xhr 获取新数据,在客户端更新数据并绘制。

【讨论】:

    【解决方案3】:

    有几个图表库可以使用:gRaphaelHighcharts 和其他人提到的一个。这些库非常易于使用且文档齐全(假设难度为 1)。

    AFAIK,这些库不是“实时的”,因为它们没有提供动态添加新点的可能性。要添加新点,您需要重新绘制完整的图表。但我认为这不是问题,因为重绘图表很快。我用 gRaphael 做了一些尝试,我没有注意到这种方法有任何问题。如果您的更新速率为 10 秒,应该可以正常工作(但这可能取决于图表的复杂性)。

    如果重绘整个图表有问题,您可能需要自己使用Raphaelpaper.js 等矢量图形库开发图表。这比使用图表库要难一些,但应该是可行的。 (假设难度为 5)。

    当您以固定的时间间隔获取数据时,您可以使用常规的 ajax 库。 jQuery 对我来说没问题,但还有其他一些选择。对于非固定间隔,这可能不是最佳选择,在这种情况下,您可能需要查看 socket.io 之类的内容,但它也会对服务器端产生影响。

    注意1:Raphael、gRaphael 和 Highcharts 不是纯粹的 HTML5,而是 SVG/VML,但我想这也是一个可以接受的选择。

    注意2:似乎Highchart在插入新点时不需要重新绘制图表。见http://www.highcharts.com/documentation/how-to-use#live-charts

    【讨论】:

    • 出于性能原因,我最初还试图找到“不每次都重绘整个图表”的解决方案。但后来我意识到这是一个谬论。任何解决方案都必须为每一帧重新绘制图表。想一想:你的显示器是如何工作的?它不断地从头开始刷新自己,它不会移动像素。因此,任何允许您“不重绘图表”的图表库都只是为您提供抽象。这种抽象是方便且可取的;尽管如此,在性能方面,它仍在为每一帧在后台重新绘制图表。
    • @Fletch 我认为不同之处在于一些重绘成本更低,因为它们是在浏览器架构中的较低级别完成的。例如,我认为将大画布上的所有像素向左移动会比使用 CSS 将实际画布向左移动更昂贵。也许不是,只是一个想法。
    • 我需要绘制最多 500,000 个数据点,以每秒约 65,000 个点的速率进行流式传输,但是图表应每 100 毫秒重新渲染/刷新一次(例如每 100 毫秒合并 6500 个新点)。这可能吗?。基本上,我们有一个实时采集系统,我们希望它以接近“实时”的方式呈现。
    • 另一个在 HighCharts 中动态添加点的现场演示:highcharts.com/demo/dynamic-update
    【解决方案4】:

    我相信这正是您正在寻找的:

    http://www.highcharts.com/demo/dynamic-update

    开源(尽管商业网站需要许可证),跨设备/浏览器,速度快。

    【讨论】:

      【解决方案5】:

      Flotr2Envision 是选项。 Flotr2 在我链接的文档页面上有一个实时示例。 Envision 上手有点困难,所以试试 Flotr2。

      【讨论】:

      • 我也推荐这个。这是一个非常可靠的库。
      • flotr2 的例子不是实时的……它只是重复地重绘整个图表。
      • @tybro0103 没错,这是实时的。起初我和你一样想,但后来我意识到这是唯一的方法。电影如何运作?在一秒钟内闪过 25 张不同的图片,它看起来像运动。监视器是如何工作的?根据现在要显示的内容不断重绘像素,重绘的速度以赫兹为单位。您不能移动图表上的像素。您必须使用新位置重新绘制图表。即使库将其抽象化并让您感觉自己在移动像素,它仍然只是在幕后重绘。
      • @Fletch 你是对的,它必须重新绘制整个东西才能显示新数据。但是,我的意思是它会重复重新加载整个数据集。检查源代码,您会看到代码for (...) {data.push(...)} 每次图表呈现时都会执行。这是在浪费 CPU,当每秒有数千个数据点时,这可能是一个真正的问题。更好的实时图表将允许您一次简单地附加一个数据点,而不是在每次有新点时重置整个数据集。
      • SmoothieCharts 做得对:smoothiecharts.org/tutorial.html
      【解决方案6】:

      http://www.rgraph.net/ 非常适合图形和图表。

      【讨论】:

        【解决方案7】:

        我建议Smoothie Charts

        它使用起来非常简单,易于配置且可广泛配置,并且在流式传输实时数据方面做得很好。

        有一个builder that lets you explore the options and generate code

        免责声明:我是图书馆的贡献者。

        【讨论】:

        • 真的很好,虽然如果它还能够绘制静态数据甚至在静态数据上绘制动态数据也会更好,例如昨天某些价格的演变和今天当前的演变,所以它比较容易。
        • 这很漂亮,而且非常易于使用。谢谢。
        【解决方案8】:

        你也可以试试 Meteor Charts,它超级快(html5 画布),有很多教程,而且文档也很好。实时更新工作得很好。您只需更新模型并运行 chart.draw() 即可重新渲染场景图。这是一个演示:

        http://meteorcharts.com/demo

        【讨论】:

          【解决方案9】:

          这是我在ChartJS 中发现的实时图表要点:
          https://gist.github.com/arisetyo/5985848

          ChartJS 看起来使用简单,看起来不错。

          还有FusionCharts,一个更复杂的企业使用库,这里有一个实时演示:
          http://www.fusioncharts.com/explore/real-time-charts

          编辑 我还开始使用 Rickshaw 制作实时图表,它易于使用且可定制: http://code.shutterstock.com/rickshaw/

          【讨论】:

          • 对于要点的真棒发现,伙计!
          【解决方案10】:

          为了完成这个线程,我建议你查看:

          d3.js

          这是一个有助于处理大量 javascript 可视化的库。然而学习曲线相当陡峭。

          nvd3.js

          使创建一些 d3.js 可视化变得容易的库(当然有限制)。

          【讨论】:

            【解决方案11】:

            您可能还想查看基于 HTML5 Canvas 元素构建的 CanvasJS Chart。它的渲染速度非常快,并且可以每 50-100 毫秒更新一次,而不会出现内存问题。

            [完全披露:我是团队的一员]

            【讨论】:

              【解决方案12】:

              这个帖子现在可能已经很老了。但是想为看到这个帖子的人分享这些结果。跑了一个比较下注。 Flotr2、ChartJS、highcharts 异步。 Flotr2 似乎是最快的。通过每 50 毫秒传递一个新数据点来测试这一点,总共最多 1000 个数据点。 Flotr2 对我来说是最快的,虽然它似乎会定期重绘图表。

              http://jsperf.com/async-charts-test/2

              【讨论】:

                【解决方案13】:

                2015 年新增 据我所知,仍然没有面向运行时的折线图库。我的意思是图表哪些行为“每 N 秒请求新点”,“清除旧数据”,您可以设置“声明性”方式。

                取而代之的是用于服务器端的石墨 api http://graphite-api.readthedocs.org/en/latest/,以及使用它的客户端插件的数量。但实际上它们非常有限,缺少我们喜欢的高级功能:数据滚动条、范围图、axeX 相位分割等。

                “显示到达图表”和“实时图表”任务之间似乎存在根本区别。

                【讨论】:

                  【解决方案14】:

                  最简单的方法可能是使用plotti.co - 我正是为此创建的微服务。这取决于您如何获取数据,但一般使用模式是将 SVG 图像包含到您的 html 中,例如

                  <object data="http://plotti.co/FSktKOvATQ8H/plot.svg" type="image/svg+xml"/>
                  

                  并在 GET 请求中将您的数据提供给您的哈希(或使用来自同一页面或任何其他页面的 (new Image(1,1)).src=... JavaScript 方法),如下所示:

                  http://plotti.co/FSktKOvATQ8H?d=1,2,3

                  在本地设置也很简单

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-12-03
                    • 1970-01-01
                    • 2018-07-10
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多