d3 坐标轴实现-散点图

版权声明:本文为博主原创文章,未经博主允许不得转载。vasttian https://blog.csdn.net/u012860063/article/details/61199366


用d3实现的一个很简略的坐标轴,可参考官方API


V3: API 中文手册

V4: D3.js 4.x 中文手册


效果例图:




PS:注意设置css时只能使用svg认识的属性,可 参考

https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute


代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>D3-coordinate-test</title>
  <script src="http://d3js.org/d3.v3.min.js"></script>
  <style>
    .cocoordinate-div {
      margin: 100px 500px 100px;
      border: 2px solid blue;
    }

    .title {
      font-size: 26px;
      font-family: 'Microsoft YaHei';
      fill: red;
    }

    /*svg属性可参考*/
    /*https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute*/

    .axis path,
    .axis line {
      fill: none;
      stroke: black;
      shape-rendering: crispEdges;
    }

    .axis text {
      font-family: 'Microsoft YaHei';
      font-size: 12px;
    }

  </style>
</head>
<body>
  <div id="coordinate" class="cocoordinate-div">
    
  </div>
  <script>

    // svg 的大小
    var svgWidth = 800;
    var svgHight = 400;
    var padding =  60;

    // 数据点
    var dataset = [
      [0, 0], [65.66, 420], [520, 260], [360, 320], [200, 200],
      [130, 623], [652, 52], [333, 666], [729, 656], [134, 352],
      [120, 56], [905, 177], [777, 888], [1200, 1000]
    ];

    // 创建SVG
    var svg = d3.select('#coordinate')
      .append('svg')
        .attr('width', svgWidth)
        .attr('height', svgHight);

    // 设置标题
    svg.append('text')
      .attr('x', svgWidth / 2 - 120)
      .attr('y', 30)
      .attr('class', 'title')
      .text('这是一个用d3画的简略坐标轴');

    // 创建比例尺
    var xScale = d3.scale.linear()
      .domain([0, d3.max(dataset, function(d) {
        return d[0];
      })]).range([padding, svgWidth - padding * 2]);

    var yScale = d3.scale.linear()
      .domain([0, d3.max(dataset, function(d) {
        return d[1];
      })]).range([svgHight - padding, padding]);

    var rScale = d3.scale.linear()
      .domain([0, d3.max(dataset, function(d) {
        return d[1];
      })]).range([2, 4]);

    // 设置散点的坐标, 半径
    svg.selectAll('circle')
        .data(dataset)
      .enter()
      .append('circle')
        .attr('cx', function(d) {
          return xScale(d[0]);
        })
        .attr('cy', function(d) {
          return yScale(d[1]);
        })
        .attr('r', function(d) {
          return rScale(d[1]);
        });

    // 设置文本
    svg.selectAll('text')
        .data(dataset)
      .enter()
      .append('text')
        .text(function(d) {
          return '(' + d[0] + ', ' + d[1] + ')';
        })
        .attr('x', function(d) {

          // 设置偏移量,让文本位于上方
          return xScale(d[0]) - 20;
        })
        .attr('y', function(d) {
          return yScale(d[1]) - 10;
        })
        .attr('font-family', 'Microsoft YaHei')
        .attr('font-size', '12px')
        .attr('fill', '#9400D3');

    // 设置精度和样式
    var formatPrecision = d3.format('$');

    // 定义X轴
    var xAxis = d3.svg.axis()
      .scale(xScale)

      // 粗略的设置刻度线的数量,包括原点
      .ticks(7)
      .orient('bottom')

      // 设置刻度格式
      .tickFormat(formatPrecision);

    // 定义Y轴
    var yAxis = d3.svg.axis()
      .scale(yScale)
      .orient('left')
      .ticks(7)
      .tickFormat(formatPrecision);

    // 创建X轴, svg中: g元素是一个分组元素
    svg.append('g')
      .attr('class', 'axis')

      // 设置据下边界的距离
      .attr('transform', 'translate(0, ' + (svgHight - padding) + ')')
      .call(xAxis);

    // 创建Y轴
    svg.append('g')
      .attr('class', 'axis')

      // Y轴离左边界的距离
      .attr('transform', 'translate(' + padding + ', 0)')
      .call(yAxis);

  </script>
</body>
</html>


猜你喜欢

转载自blog.csdn.net/u012860063/article/details/61199366