我想了解Datashader
与其他图形库(例如plotly/matplotlib
等)之间的明显区别。
我知道,要绘制成千上万个数据点,我们需要数据着色器,因为其他绘图库将挂断浏览器。
但是究竟是什么使Datashader更快且不挂起浏览器的原因是什么,以及如何精确地进行绘制却又不给浏览器带来任何负担的原因是什么????
此外,datashader不会对浏览器造成任何负担,因为在后端,datashader会基于我的数据帧创建一个图形,并且仅将图像发送到浏览器,这就是为什么它如此快速的原因?
请解释我无法清楚地了解内外。
答案 0 :(得分:1)
datashader旨在将数据集“栅格化”或“聚合”为可显示为图像的常规网格,从而使查看数据的属性和模式变得简单快捷。 Datashader可以在一台16GB的笔记本电脑上在一秒钟左右的时间内绘制出十亿个点,并且可以轻松扩展到更大的数据集的核外或分布式处理。
这些库中没有任何技巧-渲染大量点需要很长时间。数据着色器的作用是将可视化的负担从渲染转移到计算。在数据着色器中绘制指令之前,有一个很好的理由必须创建画布 。数据着色器管道中的第一步是栅格化数据集,换言之,它近似每个数据的位置,然后使用聚合函数确定每个像素的强度或颜色。这使数据着色器可以绘制大量点。点数甚至超过了内存中的点数。
另一方面,Matplotlib会渲染您指示其绘制的每个点,从而使绘制大型数据集既费时,甚至不可能。
答案 1 :(得分:1)
首先考虑Datashader可能会有所帮助,而不是与Matplotlib或Plotly相比,而是与numpy.histogram2d
相比。默认情况下,Datashader会将一长串(x,y)点转换为2D直方图,就像histogram2d一样。这样做只需要为每个新点简单增加一个网格单元,这很容易通过Numba加速到机器代码的速度,而与Dask并行化则很简单。这样,无论数据集有多大,生成的数组最多都将是显示屏的大小。因此,在添加轴,标签等的单独程序中进行处理很便宜,而且永远不会使浏览器崩溃。
相比之下,像Plotly这样的绘图程序将需要将每个数据点转换为JSON或其他序列化的表示形式,将其传递给浏览器中的JavaScript,让JavaScript将形状绘制到图形缓冲区中,并支持每个形状悬停和其他互动功能。这些交互功能很棒,但是这意味着Plotly在每个数据点上所做的工作要比Datashader多得多,并且要求浏览器可以容纳所有这些数据点。 Datashader唯一需要处理全部数据的计算是线性缩放每个点的x和y位置以适合网格,然后增加网格值,这比Plotly容易得多。
与Matplotlib的比较稍微复杂一点,因为使用Agg后端,Matplotlib还可以在显示之前预先渲染到固定大小的图形缓冲区(类似于Datashader)。但是Matplotlib是在Numba和Dask之前编写的(这使得它更难加速),它仍然必须为每个点绘制形状(不仅仅是简单的增量),它不能完全并行化操作(因为后面的点会覆盖前面的点) (在Matplotlib中),并且它提供了抗锯齿功能以及Datashader中没有的其他出色功能。因此,Matplotlib再次比Datashader做更多的工作。
但是,如果您真正想要做的是看到数十亿个数据点的忠实2D分布,那么Datashader就是您的理想之选,因为这就是它所做的全部。 :-)