【发布时间】:2011-08-11 13:49:31
【问题描述】:
我需要使用 dojo 图表库绘制数千个点,可能接近 50,000 个。它可以工作,但它肯定非常慢并且落后于浏览器。有什么办法可以获得更好的性能?
编辑:
我通过对数据应用渲染过滤器来解决。本质上,我有一个名为“render”的新项目参数,如果预计该点与其他点重叠,我的 json 源将其设置为 false。然后,我的 DataSeries 查询呈现:true 的所有点。这样,对于需要所有点的非视觉来源,所有数据仍然存在,而我的图表现在运行顺利。
伪代码:
def is_overlapped(x, y, x_round, y_round)
rounded_x = round(x, x_round)
rounded_y = round(y, y_round)
hash = hash_xy(rounded_x, rounded_y)
if(@overlap_filter[hash].nil?)
@overlap_filter[hash] = true
return false
end
return true
end
x_round 和 y_round 可以由 x 和 y 范围确定,例如 range / 100
【问题讨论】:
-
可能与 javascript 无关。 50,000 个 DOM 元素会很慢。所有的点都可见吗?您是否希望人们点击或互动或动画点?
-
50 000 个项目听起来是个坏主意 - 避免做愚蠢的事情!
-
所有点都不可见,但我不确定如何删除完全重叠的点。我想如果它非常有效,所有隐藏点都被删除了,那么剩下的点不会超过几千。
-
您能否使用聚类算法,并在用户降低到某个缩放级别之前显示带有点数的圆圈?这将需要一些预处理,但可以完成。或者,您可以显示密度(热图),直到用户放大到足够近为止。同样,用户将与此进行多少交互以及他们试图找出什么?
-
基本上,用户将看到一个散点图,以及由服务器计算的非线性拟合线。很多时候,数据中的错误会扭曲非线性拟合。我希望用户通过视觉分析来评估适合度。他们应该能够发现数据中的错误,然后单击/选择一组点以过滤掉并让服务器重新计算非线性拟合。有时他们可能需要放大图表的一部分以更好地评估某些数据是否可能是错误的一部分,或者只是为了更详细地查看已清理图表的一部分。
标签: javascript ajax dojo dojox.charting