d3 基础折现图和饼图

折线图

折现图可以使用svg折线元素polyline来定义一组相连的直线段,但是更推荐使用d3.line()path元素组合使用,这样更加灵活。

  • d3.line()构造一个新的线生成器,使用默认的.x.y设置x,y访问器函数。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <div id="test-svg">
        </div>
    </body>
    <script src="https://d3js.org/d3.v5.js"></script>
    <script>
        window.onload = function() {

            // 数据
            var data = [{
                date: new Date(2019, 3, 24),
                value: 23.24
            }, {
                date: new Date(2019, 3, 25),
                value: 72.15
            }, {
                date: new Date(2019, 3, 26),
                value: 38.84
            }, {
                date: new Date(2019, 3, 27),
                value: 58.62
            }, {
                date: new Date(2019, 3, 30),
                value: 10.80
            }, {
                date: new Date(2019, 4, 1),
                value: 85.47
            }];

            var width = 800,
                height = 400,
                padding = {
                    top: 40,
                    right: 40,
                    bottom: 40,
                    left: 40
                };
            var colors = d3.schemeSet2;
            var svg = d3.select("#test-svg")
                .append('svg')
                .attr('width', width + 'px')
                .attr('height', height + 'px');

            // x轴:时间轴
            var xScale = d3.scaleTime()
                .domain(d3.extent(data, function(d) {
                    return d.date;
                }))
                .range([padding.left, width - padding.right]);
            var xAxis = d3.axisBottom()
                .scale(xScale)
                .tickSize(10);
            svg.append('g')
                .call(xAxis)
                .attr("transform", "translate(0," + (height - padding.bottom) + ")")
                .selectAll("text")
                .attr("font-size", "10px")
                .attr("dx", "50px");

            // y轴
            var yScale = d3.scaleLinear()
                .domain([0, d3.max(data, function(d) {
                    return d.value;
                })])
                .range([height - padding.bottom, padding.top]);
            var yAxis = d3.axisLeft()
                .scale(yScale)
                .ticks(10);
            svg.append('g')
                .call(yAxis)
                .attr("transform", "translate(" + padding.left + ",0)");

            var line = d3.line()
                .x(function(d) {
                    return xScale(d.date);
                })
                .y(function(d) {
                    return yScale(d.value);
                });

            // 生成折线
            svg.append("path")
                .datum(data)
                .attr("fill", "none")
                .attr("stroke", "steelblue")
                .attr("stroke-width", 1.5)
                .attr("stroke-linejoin", "round")
                .attr("stroke-linecap", "round")
                .attr("d", line);
        }
    </script>

</html>

stroke-linecap

  • 路径两端的形状。
  • 属性值:butt | round | square | inherit

stroke-linejoin

  • 路径的转角处使用的形状
  • 属性值:miter | round | bevel | inherit

饼图

  • 饼图一般使用饼布局d3.pie()和弧线生成器d3.arc()来绘制。

饼布局d3.pie()


 // 生成饼布局
            var pie = d3.pie().value(function(d) {
                return d.value;
            })(data);
  • startAngle:弧起始角度(角度跨度默认为2π ≈6.283185307179586)
  • endAngle:弧结束角度
  • padAngle:弧之间的间隔
  • value:数值

弧线生成器d3.arc()

一般来说有四种情况:

1) 圆形:内圆半径为0,外圆半径大于0,且圆的弧度大于等于2π。会生成一个以外圆半径为半径的圆

2) 扇形:内圆半径为0,外圆半径大于0,且圆的弧度小于2π。会生成一个以外圆半径为半径的扇形

3) 环形:内圆半径大于0,外圆半径大于0,且圆的弧度大于等于2π。会生成一个环形

4) 环形扇区:内圆半径大于0,外圆半径大于0,且圆的弧度小于2π。会生成一个环形扇区

圆形饼图


<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <div id="test-svg">
        </div>
    </body>
    <script src="https://d3js.org/d3.v5.js"></script>
    <script>
        window.onload = function() {

            // 数据
            var data = [{
                value: 335,
                name: '直接访问'
            }, {
                value: 310,
                name: '邮件营销'
            }, {
                value: 234,
                name: '联盟广告'
            }, {
                value: 135,
                name: '视频广告'
            }, {
                value: 1548,
                name: '搜索引擎'
            }];
            var width = 400,
                height = 400,
                padding = {
                    top: 40,
                    right: 40,
                    bottom: 40,
                    left: 40
                };

            var colors = d3.schemeSet2;
            var svg = d3.select("#test-svg")
                .append('svg')
                .attr('width', (width * 2) + 'px')
                .attr('height', (height * 2) + 'px');

            // 生成饼布局
            var pie = d3.pie().value(function(d) {
                return d.value;
            })(data);

            var radius = Math.min(width, height);

            /*
             * 弧线生成器
             * .innerRadius 内圆半径
             * .outerRadius 外圆半径
             * .centroid 计算弧的中心
             */
            var arc = d3.arc()
                .innerRadius(0)
                .outerRadius(radius / 2);

            // 一个更大的圆弧,用来获取标注线外圈的坐标
            var outArc = d3.arc()
                .innerRadius(radius / 2)
                .outerRadius(radius);

            var line = d3.line()
                .x(function(d) {
                    return d[0];
                })
                .y(function(d) {
                    return d[1];
                });

            // 获取标注线的点数据
            var getLabelLine = function(d, type) {
                var startPos = d.startAngle + (d.endAngle - d.startAngle) / 2;
                var data = [];
                var ra = (type === "text") ? 2.5 : 1;
                data.push(arc.centroid(d));
                data.push(outArc.centroid(d));
                data.push({
                    0: outArc.centroid(d)[0] + (40 * (startPos < Math.PI ? 1 : -ra)),
                    1: outArc.centroid(d)[1]
                });

                return data;
            }

            var containers = svg.append("g")
                .attr("transform", "translate(" + height + "," + height + ")");

            var container = containers.selectAll("g")
                .data(pie)
                .join("g");

            // 绘制饼图
            container.append("path")
                .attr("stroke", "white")
                .attr("d", arc)
                .attr("fill", function(d, i) {
                    return colors[i];
                });

            // 绘制标注线
            container.append("path")
                .datum(function(d) {
                    return getLabelLine(d, "path");
                })
                .attr("class", "tips")
                .attr("fill", "none")
                .attr("stroke", "steelblue")
                .attr("stroke-width", 1)
                .attr("stroke-linejoin", "round")
                .attr("stroke-linecap", "round")
                .attr("d", line);

            // 绘制标注线上文字
            container.append("text")
                .datum(function(d) {
                    d.pos = getLabelLine(d, "text")[2];
                    return d;
                })
                .text(function(d) {
                    return d.data.name;
                })
                .attr("dx", function(d) {
                    return d.pos[0]
                })
                .attr("dy", function(d) {
                    return d.pos[1]
                });
        }
    </script>

</html>

扇形饼图


var pie = d3.pie().startAngle(0).endAngle(Math.PI).value(function(d) {
                return d.value;
            })(data);

            var radius = Math.min(width, height);

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

环形饼图


var pie = d3.pie().value(function(d) {
                return d.value;
            })(data);

            var radius = Math.min(width, height);

            var arc = d3.arc()
                .innerRadius(radius / 4)
                .outerRadius(radius / 2);

环形扇区饼图


var pie = d3.pie().startAngle(0).endAngle(Math.PI).value(function(d) {
                return d.value;
            })(data);

            var radius = Math.min(width, height);

            var arc = d3.arc()
                .innerRadius(radius / 4)
                .outerRadius(radius / 2);

原文地址:https://www.cnblogs.com/chenjy1225/p/11013474.html

时间: 2024-10-11 02:13:43

d3 基础折现图和饼图的相关文章

vue+echarts实现可拖动节点的折现图(支持拖动方向和上下限的设置)

本篇文档主要是利用echarts实现可拖动节点的折现图,在echarts中找到了一个demo,传送门:https://echarts.baidu.com/examples/editor.html?c=line-draggable,但是不是用vue写的,并且在改写为vue组件的过程中遇到了很多问题,在百度过程中发现并没有相关的文档,所以决定自己开发,并在demo的基础上开发了一些实用的功能,所以把这个过程记录下来.文档中还有很多不够完善的地方,欢迎讨论哈! 需求:制作一个折线图用于显示当前24小时

python简单的绘制折现图

在做一些数据统计时,折现图能够看出变化的趋势,最近查内存泄漏,跑了一个晚上的数据,想查查,那么折现图能够给一个很直观的结果. 我们使用pylab包来绘制图形. 我使用pip来管理python包 sudo pip install pylab 时间比较长,其会下载一些依赖的包. #!/usr/bin/python import os import matplotlib.pyplot as plt allFile = [] r = open('result', 'w') heap = [] for f

使用echarts实现了一个折现图,数据是一天24小时

arr //你的数据 dataZoom : { show: true, realtime: true, startValue: arr.length - 240, endValue: arr.length } 使用echarts实现了一个折现图,数据是一天24小时,每隔30s从数据库取一次数据,但是这样可读性很低.所以需要在加载图片后,显示最近两个小时的数据,但是dataZoom只能控制起始值,用此方法来显示最近两小时的数据 原文地址:https://www.cnblogs.com/ronle/

echarts折现图配置

js引用和div容器 1 <div id="container" style="height: 100%"></div> 2 <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script> 3 <script type

A股最新的自由现金流和折现估值查询

A股最新的自由现金流折现估值,利用自由现金流折现的经典公式,采用 8%.9%.10%.11%.12%.15% 等贴现率来进行估值. SH600000:浦发银行的最新自由现金流和折现估值模型: 浦发银行 SH600004:白云机场的最新自由现金流和折现估值模型: 白云机场 SH600005:武钢股份的最新自由现金流和折现估值模型: 武钢股份 SH600006:东风汽车的最新自由现金流和折现估值模型: 东风汽车 SH600007:中国国贸的最新自由现金流和折现估值模型: 中国国贸 SH600008:

百度推出的echarts,制表折线图柱状图饼图等的超级工具

一.简介: 1.绘制数据图表,有了它,想要网页上绘制个折线图.柱状图,从此easy. 2.使用这个百度的echarts.js插件,是通过把图片绘制在canvas上在显示在页面上. 官网对echarts的简介: ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10/11,chrome,firefox,Safari等),底层依赖轻量级的Canvas类库ZRen

html5---svg(折现数据表格)

上一篇我们说了如何画圆饼.这一次我们说如何做折线图.网上有个库chartist.js做svg矢量数据的一个库.里面有个折现统计,我没有做的和他一样,因为我也不是很熟悉svg.权当先试试水而已,所以写的不好.望各位指教.上代码!!!!!!!!!!! (function(){ function svg(option){ this.config = this.extend(this.config,option); /*表格生成*/ this.crateform(); this.holaddata();

JavaScript数据可视化编程学习(一)Flotr2,包含简单的,柱状图,折线图,饼图,散点图

一.基础柱状图 二.基础的折线图 三.基础的饼图 四.基础的散点图 一.基础柱状图 如果你还没有想好你的数据用什么类型的图表来展示你的数据,你应该首先考虑是否可以做成柱状图.柱状图可以表示数据的变化过程或者表示多个数据之间的差异. 1.引入javascrippt 使用flotr2这个JavaScript库来创建图表.使用flotr2之前,不需要引入其他的JavaScript库(比如jquery),但是flotr2必须依赖HTML5的canvas元素的支持.canvas支持的主流浏览器有:chro

安卓图表引擎AChartEngine(三) - 示例源码折线图、饼图和柱状图

折线图: [java] view plaincopy package org.achartengine.chartdemo.demo.chart; import java.util.ArrayList; import java.util.List; import org.achartengine.ChartFactory; import org.achartengine.chart.PointStyle; import org.achartengine.renderer.XYMultipleSe