我有一个包含10^5个数据点的大型数据集。现在我正在考虑与大型数据集相关的以下问题:
有没有有效的方法来可视化非常大的数据集?在我的情况下,我有一个用户集,每个用户有10^3个项目。总共有10^5个项目。我想一次显示每个用户的所有项目,以便快速比较用户之间的差异。有人建议使用列表,但我认为列表并不是处理这个大型数据集时唯一的选择。
注意
我想一次显示每个用户的所有项目。
这意味着当我点击一个用户时,我想显示所有的数据点,当我点击两个用户时,我可以比较它们之间的数据点差异。
我有一个包含10^5个数据点的大型数据集。现在我正在考虑与大型数据集相关的以下问题:
有没有有效的方法来可视化非常大的数据集?在我的情况下,我有一个用户集,每个用户有10^3个项目。总共有10^5个项目。我想一次显示每个用户的所有项目,以便快速比较用户之间的差异。有人建议使用列表,但我认为列表并不是处理这个大型数据集时唯一的选择。
注意
我想一次显示每个用户的所有项目。
这意味着当我点击一个用户时,我想显示所有的数据点,当我点击两个用户时,我可以比较它们之间的数据点差异。
问题不在于渲染它们。你可以切换到canvas或webgl进行渲染部分。你可以找到一些使用D3数据绑定的canvas和X3DOM的例子。但由于DOM对象的数量,速度会比较慢,因此最好将它们分开,就像这个平行坐标示例一样。该示例还具有渐进式呈现功能,以加载和呈现所有数据元素。
在客户端内存中保留它们并进行操作也不是问题。D3常常与Crossfilter一起使用,快速处理“百万甚至更多记录”的数据。
对于SVG交互式渲染来说,10^5个数据点略微过多。但在可视化中有太多的数据点通常意味着您拥有错误的抽象级别或错误的绘图策略。许多点可能会重叠或视觉上融合。那么为什么不聚合这些形状,例如使用热力图(颜色缩放以用于重叠点的数量)、分箱(六边形分箱、直方图)或汇总数据集?
如果您想要概述和比较数据集,您可能需要一个抽象表示,例如一些统计数据总结您的数据集,然后按需查看详细信息(语义缩放、聚焦+上下文、钻取)。
const { lightningChart } = lcjs
const data = new Array(100000).fill(0).map(_ => ({ x: Math.random(), y: Math.random() }))
const tStart = Date.now()
const chart = lightningChart().ChartXY({disableAnimations: true})
const scatterSeries = chart.addPointSeries()
.setPointSize(1)
.add(data)
requestAnimationFrame(() => {
const tEnd = Date.now()
chart.setTitle(`${data.length} points visualization ready in ${((tEnd-tStart)/1000).toFixed(3)}s`)
})
<head>
<script src="http://unpkg.com/@arction/lcjs@3.1.0/dist/lcjs.iife.js"></script>
</head>