前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >d3成神之路(五):扇形图,饼图

d3成神之路(五):扇形图,饼图

作者头像
拿我格子衫来
发布2022-01-24 15:01:45
1.7K0
发布2022-01-24 15:01:45
举报
文章被收录于专栏:TopFETopFE

制作扇形其实也是使用 svg的 path 这个属性, 重要的是计算各个扇形区域的点,与弧度 效果图

在这里插入图片描述
在这里插入图片描述

首先需要使用源数据 生成相应的弧度信息

使用d3.pie()

代码语言:javascript
复制
const data = [1, 1, 2, 3, 5, 8, 13, 21];
const arcs = d3.pie()(data);

生成弧度后 再使用 d3.arc() 来进行绘制 path

代码语言:javascript
复制
const arc = d3.arc()
      .innerRadius(0)
      .outerRadius(Math.min(innerWidth, innerHeight) / 2 - 1)

这里还学到一个技巧 就是 使用源数据的某一个属性来生成一个颜色

代码语言:javascript
复制
const color = d3.scaleOrdinal()
      .domain(data.map(d => d.name))
      .range(d3.quantize(t => d3.interpolateSpectral(t * 0.8 + 0.1), data.length).reverse())

详细代码

代码语言:javascript
复制
<!DOCTYPE html>
<html>

<head>
  <title>基础饼图</title>
  <link rel="stylesheet" href="../../css/index.css">
</head>

<body>

  <svg id="main" width="800" height="600"></svg>

  </div>

  <script src="../../js/d3.min.js"></script>
  <script src="../../js/mchart.js"></script>
  <script>

    function getSvgInfo() {
      const svg = d3.select("#main")
      const width = svg.attr('width')
      const height = svg.attr('height')
      const margin = { top: 30, right: 60, bottom: 30, left: 60 }
      const innerHeight = height - margin.top - margin.bottom
      const innerWidth = width - margin.left - margin.right
      const config = {
        colors: [
          "#5470c6",
          "#91cc75",
          "#fac858",
          "#ee6666",
          "#73c0de",
          "#3ba272",
          "#fc8452",
          "#9a60b4",
          "#ea7ccc"
        ],
        opacity: 0.8,
        tickTxt: {
          fontSize: '2em',
          color: '#6E7079'
        },
        chartTitle: {
          text: '基础饼图',
          fontSize: '18px',
          color: '#464646'
        }
      }

      return {
        svg,
        width,
        height,
        margin,
        innerHeight,
        innerWidth,
        config
      }
    }

    const data = [
      { value: 1048, name: '搜索引擎' },
      { value: 735, name: '直接访问' },
      { value: 580, name: '邮件营销' },
      { value: 484, name: '联盟广告' },
      { value: 300, name: '视频广告' }
    ]

    const {
      svg,
      width,
      height,
      margin,
      innerHeight,
      innerWidth,
      config
    } = getSvgInfo()

    const chart = svg.append('g')
      .attr('id', 'maingroup')
      .attr('transform', `translate(${margin.left},${margin.top})`)

    const arc = d3.arc()
      .innerRadius(0)
      .outerRadius(Math.min(innerWidth, innerHeight) / 2 - 1)

    const color = d3.scaleOrdinal()
      .domain(data.map(d => d.name))
      .range(d3.quantize(t => d3.interpolateSpectral(t * 0.8 + 0.1), data.length).reverse())

    const pie = d3.pie()
      .sort(null)
      .value(d => d.value)

    const arcs = pie(data);

    chart.append("g")
      .attr("stroke", "white")
      .selectAll("path")
      .data(arcs)
      .join("path")
      .attr('transform', `translate(300,300)`)
      .attr("fill", d => color(d.data.name))
      .attr("d", arc)

    setChartTitle(chart)


    function setChartTitle(chart) {
      chart.append('text').text(config.chartTitle.text)
        .attr('font-size', config.chartTitle.fontSize)
        .attr('color', config.chartTitle.color)
        .attr('transform', `translate(${innerWidth / 2}, ${-10})`)
        .attr('text-anchor', 'middle')
        .attr('font-weight', 'bold')
    }



  </script>
</body>

</html>

https://github.com/d3/d3-shape/blob/v3.0.1/README.md#pies

这里再补充一下 d3-shape 这个库的一些特性

Arcs 弧度

在这里插入图片描述
在这里插入图片描述

Pies 饼图 Lines 线性

在这里插入图片描述
在这里插入图片描述

Areas 面积

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Curves 曲线

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Custom Curves 自定义曲线 Links 连线

在这里插入图片描述
在这里插入图片描述

Symbols 多边形

在这里插入图片描述
在这里插入图片描述

Custom Symbol Types 自定义 多边形 Stacks 堆积,叠加

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Arcs 弧度
  • Curves 曲线
相关产品与服务
邮件推送
邮件推送(Simple Email Service,SES)是一款基于腾讯云端的平台化服务, 为企业提供安全稳定、简单快速、精准高效的营销、通知和事务邮件的推送服务。产品提供灵活的 IP 部署、电子邮件身份验证以及企业专属定制的启动计划,以保护发件人声誉,同时提供精准智能的数据分析。产品的服务范围覆盖200+国家/地区,可即时触达全球各地的邮箱地址。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档