热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

d3.js分页加载

当数据量过大时,使用d3.js渲染各种图时,如果一下子加载出来,会出现加载过慢,这样使用效果就不是太好,为了解决这个问题,使用了分页加载数据并渐进渲染各种图。一、数据格式数据如下:

  当数据量过大时,使用d3.js渲染各种图时,如果一下子加载出来,会出现加载过慢,这样使用效果就不是太好,为了解决这个问题,使用了分页加载数据并渐进渲染各种图。

一、数据格式

数据如下:这里是一个example.csv文件,

x,y,value
0,1,0.2
0,2,0.7
0,3,0.01
.......
100000, 20, 1

 二、读取数据和拆分数据

// 定义拆分数据函数
let splitData = [];
function getSplitData(data, num=10000) {
   let newArray = [];
  for (let index = 0; index     newArray.push(data.slice(index, index+num));
  }
  return newArray;
}
// 读取数据
d3.csv('example.csv').then(async function(data){
   let heatmapBox, rectGU,xScale, yScale, colorScale;

    let myXValue = [...new Set(data.map(d=>{return d.x;}))];
       let myYValue = [...new Set(data.map(d=>{return d.y;}))];

   // 初始化,代码在第三步骤
   renderInit(data);
  splitData = getSplitData(data);
   // draw data
  for (let c=0; c     // 分页加载的函数放在了第四步
     await renderUpdate(splitData[c]); 
   }
});

三、draw canvas和create scale

// 一个简单的初始化例子
function renderInit(data) {
const dms = {
width: 1000,
height: 600,
margin: {
top: 50,
right: 50,
bottom: 50,
left: 50
}
};
dms.innerWidth = dms.width - dms.margin.left - dms.margin.right;
dms.innerHeight = dms.height - dms.margin.top - dms.margin.bottom;
   // draw canvas
   const mainsvg = d3.select(id)
.append('svg')
.attr('width', dms.width)
.attr('height', dms.height)
.attr('id', 'mainsvg')
.style('background', '#f8f9fd');
   const maingroup = mainsvg.append('g')
.attr('transform', `translate(${dms.margin.left}, ${dms.margin.top})`);
   heatmapBox = maingroup.append('g');
    // create scale
    xScale = d3.scaleBand()
           .domain(myXValue)
           .range([0, dms.innerWidth])
           .padding(0.01)
yScale = d3.scaleBand()
          .domain(myYValue)
           .range([dms.innerWidth, 0])
           .padding(0.01)
    颜色尺度的设置参考上一节,此处省略

}

四、分页加载

// 循环加载
const renderUpdate = async function (data) {
let transition = d3.transition().duration(1000).ease(d3.easeLinear);
rectGU = heatmapBox.append('g').selectAll('rect').data(data);
// heatmapBox.append('g').selectAll('rect').data(data)
// .join('rect')
// .attr('fill', d=>colorScale(d.value))
// .style('opacity', 1)
// .transition(transition)
// .attr('x', d=>xScale(d.x))
// .attr('y', d=>yScale(d.y))
// .attr('rx', 0)
// .attr('ry', 0)
// .attr('width', xScale.bandwidth())
// .attr('height', yScale.bandwidth());
let rectEnters = rectGU.enter().append('rect')
.attr('x', d=>xScale(d.x))
.attr('y', d=>yScale(d.y))
.attr('rx', 0)
.attr('ry', 0)
.attr('width', xScale.bandwidth())
.attr('height', yScale.bandwidth())
.attr('fill', d=>colorScale(d.value))
.style('opacity', 1);
rectGU.merge(rectEnters).transition(transition)
.attr('x', d=>xScale(d.x))
.attr('y', d=>yScale(d.y));
  await transition.end();
};

  到这里,分页渲染数据完成。



推荐阅读
  • vue使用
    关键词: ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • 如何在mysqlshell命令中执行sql命令行本文介绍MySQL8.0shell子模块Util的两个导入特性importTableimport_table(JS和python版本 ... [详细]
  • 简介数组、CSV、表格、东西将一个数组转化为逗号为支解符的字符串(CSV)即表格数据。该源码来自于https:30secondsofcode.orgconstarrayToCSV( ... [详细]
  • 事变是如许的,我写了一个基于jQuery的插件,在传统的开辟形式中,我们须要如今页面引入jQuery.js,然后在引入我们的插件,我们的插件才运用。然则跟着webpack的鼓起,我 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
author-avatar
平凡天使心619
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有