datashader 和其他绘图库的区别
difference between datashader and other plotting libraries
我想了解 Datashader
和其他图形库之间的明显区别,例如 plotly/matplotlib
等
我了解到,为了绘制 millions/billions 个数据点,我们需要数据着色器,因为其他绘图库会挂起浏览器。
但是究竟是什么原因使数据着色器快速且不挂起浏览器以及绘图是如何完成的而不会给浏览器带来任何负载????
此外,datashader 不会给浏览器带来任何负载,因为在后端,datashader 会根据我的数据帧创建一个图形,并且只将图像发送到浏览器,这就是为什么它速度很快的原因??
请解释我无法清楚地理解进出。
datashader is designed to "rasterize" or "aggregate" datasets into regular grids that can be viewed as images, making it simple and quick to see the properties and patterns of your data. Datashader can plot a billion points in a second or so on a 16GB laptop, and scales up easily to out-of-core or distributed processing for even larger datasets.
这些库中没有任何技巧 - 渲染大量点需要很长时间。 DataShader 所做的是将可视化的负担从渲染转移到计算上。您必须在数据着色器中创建 canvas before 绘图指令是有充分理由的。数据着色器流水线的第一步是栅格化数据集,换句话说,它近似每条数据的位置,然后使用聚合函数来确定每个像素的强度或颜色。这允许数据着色器绘制大量的点;甚至比内存中可以容纳的点数还要多。
另一方面,Matplotlib 会渲染您指示它绘制的每个点,这使得绘制大型数据集非常耗时甚至不可能。
首先想到 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 做了更多的工作。
但是,如果您真正想做的是查看数十亿个数据点的忠实二维分布,那么 Datashader 就是您的不二之选,因为这就是它所做的一切。 :-)
我想了解 Datashader
和其他图形库之间的明显区别,例如 plotly/matplotlib
等
我了解到,为了绘制 millions/billions 个数据点,我们需要数据着色器,因为其他绘图库会挂起浏览器。
但是究竟是什么原因使数据着色器快速且不挂起浏览器以及绘图是如何完成的而不会给浏览器带来任何负载????
此外,datashader 不会给浏览器带来任何负载,因为在后端,datashader 会根据我的数据帧创建一个图形,并且只将图像发送到浏览器,这就是为什么它速度很快的原因??
请解释我无法清楚地理解进出。
datashader is designed to "rasterize" or "aggregate" datasets into regular grids that can be viewed as images, making it simple and quick to see the properties and patterns of your data. Datashader can plot a billion points in a second or so on a 16GB laptop, and scales up easily to out-of-core or distributed processing for even larger datasets.
这些库中没有任何技巧 - 渲染大量点需要很长时间。 DataShader 所做的是将可视化的负担从渲染转移到计算上。您必须在数据着色器中创建 canvas before 绘图指令是有充分理由的。数据着色器流水线的第一步是栅格化数据集,换句话说,它近似每条数据的位置,然后使用聚合函数来确定每个像素的强度或颜色。这允许数据着色器绘制大量的点;甚至比内存中可以容纳的点数还要多。
另一方面,Matplotlib 会渲染您指示它绘制的每个点,这使得绘制大型数据集非常耗时甚至不可能。
首先想到 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 做了更多的工作。
但是,如果您真正想做的是查看数十亿个数据点的忠实二维分布,那么 Datashader 就是您的不二之选,因为这就是它所做的一切。 :-)