首页 > 其他分享 >d3.js 分页加载

d3.js 分页加载

时间:2022-08-30 22:34:33浏览次数:56  
标签:attr js dms let xScale data d3 加载

  当数据量过大时,使用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 < data.length; index+=num) {
    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<splitData.length; 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(); };

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

标签:attr,js,dms,let,xScale,data,d3,加载
From: https://www.cnblogs.com/gjw0818/p/16640904.html

相关文章

  • turn.js书本翻页效果插件
     可以制作软纸页或者硬纸页的翻页动画,可设置双页或单页展示。 CDN地址:CDN-turn.js(baomitu.com)官网:Turn.js:ThepageflipeffectinHTML5(turnjs.com)官方......
  • js三级联动
    <divclass="container"><selectname=""id="hero"><optionvalue="">-请选择-</option></select><selectname=""id="skin"......
  • JS面试题一
    1、所有对象都有原型吗?并不是所有对象都有原型;比如使用Object.create()创建一个对象,我们传递一个参数,那么创建的对象的原型则会指向传递的那个对象;而不传参数,也就是创......
  • js 严格模式
    //js使用严格模式可以规范我们写代码//要启用严格模式,您只需要在JavaScript脚本的开头添加"usestrict";或'usestrict';指令即可,如下所示:<script>"usestrict";......
  • PDF.js 绘制pdf出现图片缺失
    问题:使用PDF.js绘制pdf时,偶尔出现了原本应该绘制图片的位置只出现了一部分或者空白原因:在测试环境加断点调试后发现PDF.js默认设置的最大图片maxImageSize为10241024,所......
  • PreloadJS预加载插件
     一个Javascript插件,可以管理和协调资源的加载进度。 CDN地址:https://cdn.baomitu.com/PreloadJS //实例LoadQueue类,得到实例对象queue。letqueue=new......
  • js实现 LRU 算法
    方式一:map实现classLRU{constructor(size){this.size=size;this.cache=newMap();}get(key){if(this.cache.has(ke......
  • geopandas 生成 geojson 文件
    创建GeoDataFrame 输出geojson文件importgeopandasss=np.stack((lon.flatten(),lat.flatten()),1)ss1=[Point(ss[0].tolist())foriinss]print(ss)......
  • vue.js3: 多张图片合并([email protected])
    一,安装用到的第三方库1,安装:liuhongdi@lhdpc:/data/vue/pdf/image2pdf$npmi-Svuedraggable@nextadded2packagesin11s2,查看已安装的版本:liuhongdi@lhd......
  • Element UI el-select 从远端加载数据
    最近做项目用到了ElementUI的el-select组件,我的需求是想要从远端服务器直接加载options,加载的时候有个loading,但是ElementUI文档只给出了从远端搜索的案例,用起来不......