前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何用d3生成一个饼图

如何用d3生成一个饼图

作者头像
frontoldman
发布2019-09-03 16:14:04
6930
发布2019-09-03 16:14:04
举报
文章被收录于专栏:樯橹代码樯橹代码
代码语言:javascript
复制
initPieChart: function (el, data) {
    // var data = [2, 4, 8, 10];

    // 得到容器的尺寸
    var width = el.width(),
      height = el.height();
    var radius = Math.min(width, height) / 3;

    // 清空容器
    d3.select(el[0])
      .select("svg")
      .remove();
      
    // 容器插入svg
    var svg = d3.select(el[0])
      .append("svg")
      .attr("width", width)
      .attr("height", height)
      .append("g")
    
    // 创建内部容器放置图表,并且移动到中间
    g = svg.append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

 
    // 根据数据key从颜色序列取得固定颜色
    var color = d3
      .scaleOrdinal()
      .domain(
        data.map(function (d) {
          return d.lx;
        })
      )
      .range([
        '#4aff14', '#f52c56', '#41a3f4', '#f2c92f'
      ]);

    // d3 v4 api指定使用数据的哪个字段生成pie
    var pie = d3.pie()
      .value(function (d) { return d.overps });

    // pie部分的arc,得到一个函数,用来生成pie每个部分的path路径
    var arc = d3.arc()
      .innerRadius(0)
      .outerRadius(radius);

    var innerArc = d3.arc()
      .innerRadius(0)
      .outerRadius(radius * 2);

    var outerArc = d3.arc()
      .innerRadius(0)
      .outerRadius(radius * 2.5);

    //pie容器
    var arcs = g.selectAll("arc")
      .data(pie(data))
      .enter()
      .append("g")
      .attr("class", "arc")

    //生成pie每个部分的path,并且赋值path的路径
    arcs.append("path")
      .attr("fill", function (d, i) {
        return color(i);
      })
      .attr("d", arc);

    var key = function (d) {
      return d.data.lx;
    };

    var polyline = g.selectAll("polyline")
      .data(pie(data), key)

    // 生成指示折现
    polyline.enter()
      .append("polyline")
      .style("stroke", '#fff')
      .style('fill', 'none')
      .style("stroke-width", '2px')
      .attr("points", function (d) {
        // var pos = outerArc.centroid(d);
        // pos[0] = radius * 0.5 * (midAngle(d) < Math.PI ? 1 : -1);
        var r1 = arc.centroid(d)
        var result = [innerArc.centroid(d), outerArc.centroid(d)]
        console.log(result)
        return result
      });

    function midAngle (d) {
      return d.startAngle + (d.endAngle - d.startAngle) / 2;
    }

    var text = g.selectAll("text")
      .data(pie(data), key);

    text.enter()
      .append("text")
      .attr("dy", ".35em")
      .attr('fill', '#fff')
      .attr('text-anchor', function (d) {
        return midAngle(d) < Math.PI ? "start" : "end";
      })
      .text(function (d) {
        return d.data.lx;
      })
      .attr('transform', function (d) {
        var pos = outerArc.centroid(d);
        return "translate(" + pos + ")";
      })

  }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档