d3.js 基础学习

news2024/9/30 5:26:27

1. 下载安装

  1. npm 安装

    npm install d3
  2. 类型支持(ts)

    npm install @types/d3
  3. 导入

    import * as d3 from "d3"

2. 如何使用d3.js画图

eg:

d3.select('body')
.append('svg')
.attr('width',500)
.attr('height',500)
  • 这行代码的意思是:选择 body 标签,添加 svg 元素,设置 svg 元素的宽度和高度为 500。

2.1 选择和操作

  • d3选择元素提供了两个函数

    • select

    • selectAll

  • 选择元素后可以操作元素,操作元素主要分为增加 ( append )、插入 ( insert )、删除元素 ( remove ) 和设置获取元素属性 ( attr, style )。下面用一个例子展示 D3 选择和操作元素,便于理解,大家可以自己逐行添加运行。

2.2 数据绑定

  • D3中数据绑定提供了datum()和data()两个函数

    • datum():绑定一个数据到选择集上

      • 这个方法不会进行数据绑定的(update、enter、exit),只能在现有的元素上绑定数据。如果 value 是数组会自动转成字符串

    • data():更常用, 绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定

      var body = d3.select("body");
      var p = body.selectAll("p");
      ​
      p.data(dataset)
        .text(function(d, i){
            return d;
        });

  • 数据绑定是将数据绑定到DOM元素上,这是D3最大的特色,也是D3的设计哲学

2.3 插入,删除元素

插入元素涉及的函数有两个

  • append() :在选择集末尾插入元素

    body.append("p")
        .text("append p element");

  • insert() : 在选择集前面插入元素

    在 body 中 id 为 myid 的元素前添加一个段落元素。
    body.insert("p","#pear-id")
      .text("insert p element");

2.4 . 比例尺

  • 原因在于真实数据与创建数据可视化的视觉元素大小之间存在差异。

let scale = d3.scaleLinear()
           .domain([0,10000])
           .range([0,100])
  • 其中 scaleLinear() 对应法则,domain() 是定义域,range() 是值域。

3. 做一个简单的图表

3.1 画布

  • HTML 5 提供两种强有力的“画布”:SVGCanvas

3.1.1 添加画布
  1. 使用 D3 在 body 元素中添加 svg

var svg = d3.select("body")     //选择文档中的body元素
    .append("svg")          //添加一个svg元素
    .attr("width", width)       //设定宽度
    .attr("height", height);    //设定高度
  1. 绘制矩形

<svg>
	<rect></rect>
	<rect></rect>
</svg>
  • 矩形的属性

    • x:矩形左上角的 x 坐标

    • y:矩形左上角的 y 坐标

    • width:矩形的宽度

    • height:矩形的高度

  1. 绑定属性

    var dataset = [ 250 , 210 , 170 , 130 , 90 ];
    .
    .
    svg.selectAll("rect")   //选择svg内所有的矩形
        .data(dataset)  //绑定数组
        .enter()        //指定选择集的enter部分
        .append("rect") //添加足够数量的矩形元素
        .attr("fill","steelblue");//是给矩形元素设置颜色

3.2 比例尺

var min = d3.min(dataset); //得到最小值
var max = d3.max(dataset); //得到最大值

var scaleLinear = d3.scaleLinear()
        			.domain([min, max])
        			.range([0, 300]);

scaleLinear(0.9);    //返回 0
scaleLinear(2.3);    //返回 175
scaleLinear(3.3);    //返回 300
  • 其中,d3.scaleLinear() 返回一个线性比例尺。domain() 和 range() 分别设定比例尺的定义域和值域。在这里还用到了两个函数,它们经常与比例尺一起出现:

    • d3.max()

    • d3.min() 这两个函数能够求数组的最大值和最小值,是 D3 提供的。按照以上代码,

3.3 坐标轴

  • D3 中提供了专门的坐标轴模块d3-axis,只需要几行代码就可以生成各种各样的坐标轴。一般情况下,坐标轴要与比例尺一起使用。记住这句话,离开比例尺的坐标轴就是耍流氓。

  • <g>分组元素 ,是 SVG 画布中的元素,意思是 group。此元素是将其他元素进行组合的容器,在这里是用于将坐标轴的其他元素分组存放。

  • D3 提供了轴生成器:d3.axisTop()、d3.axisRight()、 d3.axisBottom()、d3.axisLeft()。它为我们完成了以上工作。

3.3.1 定义坐标轴
var dataset = [2.5, 2.1, 1.7, 1.3, 0.9]; //数据
//定义线性比例尺
var xScale = d3
  .scaleLinear()
  .domain([0, d3.max(dataset)])
  .range([0, 250]);
//定义坐标轴
var axis = d3
  .axisBottom(xScale) //定义一个axis并指定刻度的方向为bottom(朝下)且指定比例尺为xScale
  .ticks(7); //指定刻度的数量

4. 动态图表

  • transition() 启动过渡效果

4. 树状图

树状图,可表示节点之间的包含与被包含关系。

4.1 树状图知识点:

d3.hierarchy(),层级布局,需要和tree生成器一起使用,来得到绘制树所需要的节点数据和边数据; d3.hierarchy().sum() ,后序遍历; d3.tree(),创建一个树状图生成器; d3.tree().size(),定义树的大小; d3.tree().separation(),定义邻居节点的距离; node.descendants()得到所有的节点,已经经过转换的数据; node.links(),得到所有的边,已经经过转换的数据; d3.linkHorizontal(),创建一个贝塞尔生成曲线生成器,当然不止只有水平的,还有垂直的(d3.linkVertical())

4.2 案例

<script lang="ts" setup>
​
import * as d3 from 'd3'
import {onMounted} from "vue";
​
// var width:any = svg.attr("width");
// var height:any = svg.attr("height");
​
​
onMounted(() => {
  interface HierarchyNode {
    name: string;
    value?: number;
    children?: HierarchyNode[];
  }
  // 需要渲染的数据
  var dataset = {
    name: "中国",
    children: [
      {
        name: "浙江",
        children: [
          {name: "杭州", value: 100},
          {name: "宁波", value: 100},
          {name: "温州", value: 100},
          {name: "绍兴", value: 100}
        ]
      },
      {
        name: "广西",
        children: [
          {
            name: "桂林",
            children: [
              {name: "秀峰区", value: 100},
              {name: "叠彩区", value: 100},
              {name: "象山区", value: 100},
              {name: "七星区", value: 100}
            ]
          },
          {name: "南宁", value: 100},
          {name: "柳州", value: 100},
          {name: "防城港", value: 100}
        ]
      },
      {
        name: "黑龙江",
        children: [
          {name: "哈尔滨", value: 100},
          {name: "齐齐哈尔", value: 100},
          {name: "牡丹江", value: 300},
          {name: "大庆", value: 100}
        ]
      },
      {
        name: "新疆",
        children:
            [
              {name: "乌鲁木齐"},
              {name: "克拉玛依"},
              {name: "吐鲁番"},
              {name: "哈密"}
            ]
      }
    ]
  };
​
  //定义边界
  var marge = {top: 50, bottom: 0, left: 10, right: 0};
  var svg = d3.select("svg")
​
  var g = svg.append("g")
      .attr("transform", "translate(" + marge.top + "," + marge.left + ")");
  var scale = svg.append("g")
      .attr("transform", "translate(" + marge.top + "," + marge.left + ")");
  //扁平化获得树状数据
  var hierarchyData = d3.hierarchy<HierarchyNode>(dataset)
      .sum(function (d) {
        console.log(d.value)
        return d.value;
      });
  console.log(hierarchyData)
  //创建一个树状图
  var tree = d3.tree()
      .size([400, 200])
      .separation(function (a, b) {
        return (a.parent == b.parent ? 1 : 2) / a.depth
      })
  //初始化树状图,也就是传入数据,并得到绘制树的基本数据
  var treeData = tree(hierarchyData);
  //得到边和节点(已经完成转换的)
  var nodes = treeData.descendants();
  var links = treeData.links();
​
  // 定义节点类型接口
  interface TreeNode {
    x: number; // 节点的 x 坐标
    y: number; // 节点的 y 坐标
    // 如果需要,可以添加其他属性,例如子节点
    children?: TreeNode[];
  }
​
  // 创建树形贝塞尔曲线生成器
  const Bézier_curve_generator = d3.linkHorizontal<TreeNode, TreeNode>()
      .x((d) => d.y) // x 坐标使用 y 属性
      .y((d) => d.x); // y 坐标使用 x 属性
​
  //绘制边
  g.append("g")
      .selectAll("path")
      .data(links)
      .enter()
      .append("path")
      .attr("d", function (d) {
        var start = {x: d.source.x, y: d.source.y};
        var end = {x: d.target.x, y: d.target.y};
        return Bézier_curve_generator({source: start, target: end});
      })
      .attr("fill", "none")
      .attr("stroke", "yellow")
      .attr("stroke-width", 1);
  //建立用来放在每个节点和对应文字的分组<g>
  var gs = g.append("g")
      .selectAll("g")
      .data(nodes)
      .enter()
      .append("g")
      .attr("transform", function (d) {
        var cx = d.x;
        var cy = d.y;
        return "translate(" + cy + "," + cx + ")";
      });
​
  //绘制节点
  gs.append("circle")
      .attr("r", 6)
      .attr("fill", "white")
      .attr("stroke", "blue")
      .attr("stroke-width", 1);
​
  //文字
  gs.append("text")
      .attr("x", function (d) {
        return d.children ? -40 : 8;
      })  // 如果某节点有子节点,则对应的文字前移
      .attr("y", -5)
      .attr("dy", 10)
      .text(function (d) {
        return d.data.name;
      })
​
})
​
</script>
​
<template>
  <div class="container">
​
    <svg>
​
    </svg>
  </div>
</template>
​
<style lang="less">
​
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…

【Mysql】SQL语言基础

1、SQL的概述 SQL全称&#xff1a;Structured Query Language,是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统systemr上实现。 美国国家标准局&#x…

亚信安全发布第34期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件91起&#xff0c;近三周勒索事件数量较为稳定。从整体上看&#xff0c;Ransomhub是影响最严重的勒索家族&#xff1b;Play和ElDorado恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。本周&#xff0c;土耳其公司巴克皮…

小红书2024秋招后端开发(Java工程师、C++工程师等)

前几天做了美团&#xff0c;OPPO的秋招笔试题&#xff0c;然后又做了一场小红书&#xff0c;总体难度我觉得都差不多&#xff0c;涉及到的知识点要么是语法模拟&#xff0c;或者就是一些基础算法&#xff0c;所以这样看秋招编程题还是很简单的&#xff0c;对于笔试我们还要把除…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在&#xff0c;只需要复制到指定的位置即可。 sentinel是独立进程&#xff0c;有对应的脚本来执行。 基于之前的redis 一主二从的架构&#xff0c;我们继续启动3个sentinel进程。 哨兵模式的…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中&#xff0c;使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据&#xff0c;非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

GPU参数指标

以英伟达的A800卡为例&#xff0c;简单聊聊GPU卡的核心参数指标&#xff0c;A800的核心指标主要有5个&#xff0c;为算力、显存大小、显存带宽、功耗情况和卡间互联速率。 性能&#xff1a;则可以理解为货车对不同货物类型的马力大小&#xff0c;决定能“拉动”多少重量的货&…

实用工具推荐---- PDF 转换

直接上链接&#xff1a;爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下&#xff1a; 全免费&#xff01;&#xff01;&#xff01;&#xff01;

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…

httpsok-v1.17.0-SSL通配符证书自动续签

&#x1f525;httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻…

Java中使用接口实现回调函数的详解与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【2025】springboot基于微信小程序记账本的设计与实现(源码+文档+调试+答疑)

文章目录 前言一、主要技术&#xff1f;二、项目内容1.整体介绍&#xff08;示范&#xff09;2.运行截图3.系统测试 总结更多项目 前言 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;记账本小…

【游戏分组】

题目来源 from itertools import combinations def get_input(): """获取输入的整数列表。""" return list(map(int, input("请输入10个整数&#xff08;用空格分隔&#xff09;: ").split())) def get_min_difference(arr): &q…

OpenCV C++霍夫圆查找

OpenCV 中的霍夫圆检测基于 霍夫变换 (Hough Transform)&#xff0c;它是一种从边缘图像中识别几何形状的算法。霍夫圆检测是专门用于检测图像中的圆形形状的。它通过将图像中的每个像素映射到可能的圆参数空间&#xff0c;来确定哪些像素符合圆形状。 1. 霍夫变换的原理 霍夫…

【韩顺平Java笔记】第3章:变量

只记录我觉得重点的&#xff0c;自用&#xff0c;如果有漏的请自己看视频 文章目录 33. 内容梳理34. 变量原理34.1 为什么需要变量35. 变量概念35.1 概念35.2 变量使用的基本步骤36. 变量入门36.1 变量使用入门案例 37. 变量细节37.1 变量使用注意事项 38. 加号使用38.1 程序中…

身份证号、定位信息等个人信息敏感性判定解析

关于身份证号号码以及精确定位信息是否是敏感个人信息的疑问一直以来不少合规安全从业者有疑惑&#xff0c;本文来自于《数安标准强基助力计划 》作者为指南和标准的起草者&#xff0c;其观点具有一定的权威性&#xff0c;一下为内容摘要&#xff0c;以供大家学习和解惑&#x…

【sourceTree问题】拉取提交的时候需要频繁输入账号密码

用sourceTree进行代码管理的时候会出现一直让输入账号密码的问题&#xff0c;烦不胜烦&#xff0c;可以点击【设置】 → 【编辑配置文件...】打开配置文件&#xff1a; 在配置文件里找到url&#xff0c;把url里面的网址修改为&#xff1a; http://username:passwordxxxxx/xx…

LeetCode 热题 100 回顾7

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战

作者&#xff1a;胡志广(独鳌) 背景 Serverless 应用引擎 SAE 事件中心主要面向早期的 SAE 控制台只有针对于应用维度的事件&#xff0c;这个事件是 K8s 原生的事件&#xff0c;其实绝大多数的用户并不会关心&#xff0c;同时也可能看不懂。而事件中心&#xff0c;是希望能够…

实验3 使用Wiresharkl观察ping命令的工作过程

1、实验目的&#xff1a; 了解嗅探器工具Ethereal&#xff08;Wireshark&#xff09;的下载和安装方法&#xff1b; 掌握Ethereal&#xff08;Wireshark&#xff09;的简单使用方法&#xff1b; 了解抓包结果的分析方法&#xff08;最好是把菜单中所有的菜单命令都尝试一下&…