D3.js v5.0 堆栈图

在这里插入图片描述
数据:

 data: [
      { month: '2019-1-1', apples: 3840, bananas: 1920, cherries: 960, oranges: 300 },
      { month: '2019-1-2', apples: 1600, bananas: 1440, cherries: 960, oranges: 400 },
      { month: '2019-1-3', apples: 640, bananas: 960, cherries: 640, oranges: 200 },
      { month: '2019-1-4', apples: 320, bananas: 480, cherries: 640, oranges: 500 },
    ],
import * as d3 from 'd3';

export default function stackRect(id, data) {
  (() => {
    d3.select(id)
      .selectAll('svg')
      .remove();
  })();
  const height = 800;
  const width = 800;
  const margin = 20;
  const padding = {
    left: 100,
    right: 100,
    top: 100,
    bottom: 100,
  };

  const axisHeight = height - padding.top - padding.bottom;
  const axisWidth = width - padding.left - padding.right;
  const colorZ = d3.scaleOrdinal(d3.schemePaired);

  // 数据转换器
  const stack = d3
    .stack()
    .keys(['apples', 'bananas', 'cherries', 'oranges'])
    .order(d3.stackOrderNone) // 使用原始数据的顺序不进行顺序调整
    .offset(d3.stackOffsetNone);// 堆栈偏移-零基线
  const stackData = stack(data);

  // x与y比例尺
  const xScale = d3
    .scaleBand()
    .range([0, axisWidth])
    .domain(data.map(d => d.month));
  const yScale = d3
    .scaleLinear()
    .range([axisHeight, 0])
    .domain([0, d3.max(stackData[stackData.length - 1], item => item[1])]);

  // x轴和y轴
  const xAxis = d3.axisBottom().scale(xScale);
  const yAxis = d3.axisLeft(yScale);
  // 画布
  const svg = d3
    .select(id)
    .append('svg')
    .attr('width', width)
    .attr('height', height);
  // 添加x轴
  svg
    .append('g')
    .attr('class', 'axis')
    .attr('transform', `translate(${padding.left},${height - padding.bottom})`)
    .call(xAxis);
  // 添加y轴
  svg
    .append('g')
    .attr('class', 'axis')
    .attr('transform', `translate(${padding.left},${padding.top})`)
    .call(yAxis);
  // 将二维数组的第一维剥离,打散成n列
  const rectContainer = svg
    .selectAll('rectContainer')
    .data(stackData)
    .enter()
    .append('g')
    .attr('class', 'rectContainer')
    .attr('fill', d => colorZ(d.key));
  // 渲染每一列
  rectContainer
    .selectAll('rect')
    .data(d => d)
    .enter()
    .append('rect')
    .attr('x', d => {
      return xScale(d.data.month) + padding.left + margin / 2;
    })
    .attr('y', d => {
      return yScale(d[1]) + padding.top;
    })
    .attr('width', () => {
      return xScale.bandwidth() - margin;
    })
    .attr('height', d => {
      return height - padding.top - padding.bottom - yScale(d[1] - d[0]);
    })
    .attr('stroke', '#ccc');

  // 添加图例
  svg
    .selectAll('circle')
    .data(['apples', 'bananas', 'cherries', 'oranges'])
    .enter()
    .append('circle')
    .attr('cx', () => {
      return width - padding.right - 80;
    })
    .attr('cy', (d, i) => {
      return padding.top + 25 * i;
    })
    .attr('r', '6')
    .attr('fill', d => {
      return colorZ(d);
    });
  const texts = svg
    .selectAll('textContainer')
    .data(['apples', 'bananas', 'cherries', 'oranges'])
    .enter()
    .append('g')
    .attr('class', 'textContainer');
  texts
    .append('text')
    .attr('x', () => {
      return width - padding.right - 60;
    })
    .attr('y', (d, i) => {
      return padding.top + 25 * i;
    })
    .attr('dy', '0.32em')
    .text(d => d)
    .attr('fill', d => colorZ(d));
}

 你手头有一些数据,想做成漂亮的表放到网站上?好主意,通过浏览器来跨平台实现数据可视化是正确的选择。什么,你还想让表能够响应用户操作?没问题,交互式表比静态片更能吸引人去探究本源。好啦,要生成通过浏览器展示的动态表,目前热门的Web数据可视化库——D3。   《灵程序设计丛书·数据可视化实战:使用D3设计交互式表》这本书很有意思,而且对读者要求不高。不需要知道什么是数据可视化,也不用有太多Web开发背景就能看懂它。不信?翻一翻就知道这是一本既好玩又实用的动手指南啦!看完这本书你会怎么样呢?   掌握必要的HTML、CSS、JavaScript和SVG基础知识;   学会基于数据在网页里生成元素和为它们设置样式的技巧;   能够生成条形、散点、饼、堆叠条形和力导向;   使用平滑的过渡动画来展示数据的变化;   赋予表动态交互能力,响应用户从不同角度探索数据的请求;   收集数据和创建自定义的地;   另外,《灵程序设计丛书·数据可视化实战:使用D3设计交互式表》100多个代码示例都可以在线浏览! 【电子版来自互联网,仅供预览及学习交流 使用,不可用于商业用途,如有版权问题,请联系删除,支持正版,喜欢的 请购买正版书籍: https://e.jd.com/30336473.html】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值