如何解决数据量较大时,图表的视觉展示出现的性能问题?

1.提升图表控件性能。(UI,绘图)

重写控件

2.对数据进行采样,保留特征点。(减少数据)

使用采样算法


对于间隔一定的时序数据来说,通常以曲线图的方式来展现数据随时间变化的线性关系,进而通过视觉方式来直观判断整个采集过程中数据的波动情况,如上升,下降,陡然跳变等。

均匀采样。这是最容易想到的办法。从所有数据中,等间隔地获取我们想要的数据,然后将其他数据直接丢弃掉。但是,有一个问题:我们无法判断所丢弃的数据中是否存在特征点或异常值,数据在图表上的曲线“形状”被改变了,那些波峰,波谷,跳变可能被抹去了。显然,这样的结果不是我们所想要的。

RDP算法(拉默·道格拉斯·普克算法)[1]。通常,这种算法广泛地用于GIS中轨迹的压缩,保留原始曲线图形的形状。压缩曲线,降低绘制进度,减少点的数量,保留曲线形状,这是它的用途。我们的目的是什么呢?在保留图表上曲线形状的情况下,尽可能降低点的数量,从而解决图表控件因数据量太大所造成的性能问题。将它作为数据采样算法,应用到实际图表展示中,效果似乎也不错。但它也有一个问题:它的阈值设定是根据曲线波动的幅度来确定的,我们无法预测下一条曲线的波动情况进而确定采样算法的阈值,或者说在应用到图表展示时比较困难。它就像“玄学调参”般无法去确定一个具体的阈值设定。因为采集的数据在未展示时,必须再次通过计算方式来动态地判断它的局部或整体的波动状况,从而引入更多的不确定性。不确定意味着更多的时间,性能的下降。

LTTB算法[2][3][4]。根据这篇博客[5]的介绍,LTTB算法主要源于Visvalingam-Whyatt算法[6][7]。该算法能保留数据在图表坐标上的“形状”特征,最重要的是,算法的阈值设定是根据曲线预期得到的点的数量来确定。也就是说,我们可以在设定指定个数点的情况下,尽可能的保留原始数据在图表上的视觉特征。而数据采样的预期数目又可以根据图表在屏幕上的像素来确定。根据图像信号采样中的奈奎斯特频率[8][9]来说,绘制任何大于屏幕分辨率1/2的点数,是一种浪费[10]。这样,我们便可以通过图表在显示界面的实际宽度,进而确定数据的采样个数,得到一个相对比较好的图表显示效果。

如果你使用python,这里[11]也有对应的算法。


  1. https://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm ↩︎

  2. https://blog.csdn.net/qq_37960007/article/details/109445735?spm=1001.2014.3001.5501 “【时间序列降维】一种领先国内的降维算法—LTTB降维拟合算法” ↩︎

  3. https://github.com/sveinn-steinarsson/flot-downsample/ “LTTB 算法作者的 Github 代码示例” ↩︎

  4. https://skemman.is/handle/1946/15343 “LTTB 算法作者的原始论文” ↩︎

  5. https://www.cnblogs.com/T-ARF/p/14624698.html ↩︎

  6. https://en.wikipedia.org/wiki/Visvalingam–Whyatt_algorithm ↩︎

  7. https://blog.csdn.net/sinat_41310868/article/details/114500282 "常用的地图数据概化算法:Douglas-Peucker 与 Visvalingam-Whyatt " ↩︎

  8. https://en.wikipedia.org/wiki/Nyquist_frequency ↩︎

  9. https://blog.csdn.net/qq_36763031/article/details/104020114 “奈奎斯特采样定理—以二维图像为例” ↩︎

  10. https://stackoverflow.com/questions/952657/most-performant-way-to-graph-thousands-of-data-points-with-wpf “Most performant way to graph thousands of data points with WPF?” ↩︎

  11. https://pypi.org/project/lttb/ ↩︎

已经很久没有人在她身边呆上一会儿了。

也许这是一个错误。即便她从梅里亚搬回到老家,属于另外一个人的声音仍时不时从窗外、厨房、客厅、浴室,平整的床单上传来。空气透明得仿佛身处在手术室,鼻尖隐约嗅到发梢间的野花味道。蓝色?她看着窗边的阴影,一朵花有气无力地垂在茎秆上头,干瘪得几乎失去所有水分,是褐黄色。

她回忆起自己离开老家房子时的样子,手指无意识地拍打掉漆的茶几。风铃的声音掠过相片,大脑袋电视机,结着蛛网的衣架,泛黄的明星海报和靠在沙发上的过时娃娃……她想着坐地铁过安检时见到的那个中年女人,对方朝着安检人员大吼大叫的情形,恍惚间发现了正对着镜子发呆的自己。

不是她,会是她。

箜提起木桶,踉踉跄跄地朝偏门走去。客栈里最近人多了些,箜既高兴能多见识些外来的人,趁韩掌柜不注意的时候听这些满脸尘土,大嗓门的汉子们侃山,聊些比刘大妈脸上长了个瘤子之类有趣的闲篇;又不得不捏着鼻子,哼哧哼哧地将腥臭的马桶夜壶一个一个,慢慢挪到西边粪池里 —— 老李已经将这个月的量都都包圆了,这劲儿头许是要大干一场。甲号房的客人早上已先行结账走人了,话少干脆,昨晚吃了饭,洗了脚,收拾利落后就再没动静。丙字号住那儿俩位,好家伙,飞龙倒海,潮水拍岸,哼哼唧唧了整夜。守夜的宁三儿早上眼圈都是青的,看上去给折腾的够呛。早上刚见箜的时候,对方就絮絮叨叨地朝他小声抱怨夜间吵闹,寒风呼呼,有女妖如何如何。

雪已经停了,门外是两三行稀稀疏疏的脚印,人踩上去咯吱咯吱地响,比推门声低一点,砰砰的,又像是嚼炒黄豆。人闲的时候,靠在那儿,可以巴啦啦地将一荷包的豆子嚼一下午,看着大门外重新落下绒毛一样的大雪,天色渐渐由白转灰。“咣当” 一声,箜头痛地看着桶子里的秽物陷进雪地,黄汤直浸入湿湿的泥里。他连忙抄起树在墙边的一把铁锹,将秽物和雪一同铲起,径直小跑到粪池里倒掉,看样子显然不是第一次犯这样的错误了。

几只灰色的鸟在附近的雪堆里轻轻啄着土里的东西,围着几株荒草跳来跳去。地上零星的散落着湿漉漉,软趴趴的叶片,半掩在积雪中。

“这几天雪下得大得很,以现在这个速度,兴许咱们到了以后还能歇歇脚,在谷里多转悠个几天。”

“陆兄说的是,连着下了好几场雪,昨天在老鸭潭赶路时,就看到对面一个挑货郎一直在抱怨。听口音,像是黄树坡的。我记得刘老弟的侄儿就是黄树坡的吧,上次见他还害羞的要命,不知道现在怎么样啊?”

一脸胡茬的张睿安朝收拾包袱的同伴问道,整张圆脸上带着些许好奇。

陆逢年呆了一会儿,回答:“你说界空啊,他父亲说他跟着一个老乡进城谋生去了,许是做跑堂小厮,给客人端茶送水,好见些世面。”

“安稳些也好,不像我们,风里来雨里去,还要时不时担心路上的强人,这日子也不知什么时候是个头。”

两位一边整理着自己的行李,顺手把腰上、腿上绑带扎紧了些。二人朝柜台后打呼的老头儿结了账,便往大路东边走去。

南边的天色格外灰暗。店里没多少客人,箜坐在小马扎上,有一搭没一搭的嚼着豆子,瞅着树林子间来来去去的鸟,干坐着发呆。

去年的这个时候,一伙据说要行走江湖的客人们刚离开半天,打东边来的另一伙抱怨自己遇上一帮子杵在雪地里的疯乞丐,问他们要什么也不说,鼻青脸肿的。这让原本还有些想法的箜一下子就作了罢,安心呆在这个客栈里。

只是,黄树坡究竟是哪里呢?那里是什么样子?