使用D3.js进行数据可视化

news2025/1/14 18:33:16
D3.js介绍

  D3.js是一个流行的JavaScript数据可视化库,全称为Data-Driven Documents,即数据驱动文档。它以数据为核心,通过数据来驱动文档的展示和操作。D3.js提供了丰富的API和工具,使得开发者能够创建出各种交互式和动态的数据可视化效果。

官方介绍网站:What is D3? | D3 by Observable

D3.js导入方式介绍

  在JavaScript中导入D3.js通常使用ESM+CDN、UMD+CDN和UMD+local这三种方式,其中:ESM (ES Modules):ESM是ECMAScript模块(ECMAScript Modules)的缩写,也被称为ES6模块,是JavaScript官方的模块化方案。它使用importexport语句进行模块的导入和导出,支持静态导入和动态导入。

CDN (Content Delivery Network):CDN即内容分发网络,是一种通过分布在多个地理位置的服务器来快速、有效地向用户分发内容的网络服务。使用CDN可以加快资源的加载速度,提高用户体验。

UMD (Universal Module Definition):UMD是一种通用的模块定义方式,旨在使JavaScript库或模块能够在多种环境中使用,包括浏览器全局变量方式、AMD环境和CommonJS环境(如Node.js)。UMD允许库或模块在各种不同的JavaScript模块加载器和环境中运行。

local:将JavaScript库或模块直接保存在本地项目中,而不是从外部CDN或其他远程位置加载。

D3.js导入方式1:ESM+CDN
<!DOCTYPE html>
<div id="container"></div>
<script type="module">

import * as d3 from "https://cdn.jsdelivr.net/npm/d3@7/+esm";

// 一大堆代码

</script>
D3.js导入方式2:UMD+CDN 
<!DOCTYPE html>
<div id="container"></div>
<script src="https://cdn.jsdelivr.net/npm/d3@7"></script>
<script type="module">

// 一大堆代码
</script>
 D3.js导入方式3:UMD+local
<!DOCTYPE html>
<div id="container"></div>
<script src="/d3.v7.js"></script>
<script type="module">

// 一大堆代码
</script>

D3.js文件官方下载地址:Getting started | D3 by Observable

使用D3.js绘制柱形图
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="utf-8">  
    <title>GGBoy</title>  
    <script src="/d3.v7.js"></script>  
</head>  
<body>  
    <script>  
        const width = 640;  
        const height = 400;  
        const marginTop = 20;  
        const marginRight = 20;  
        const marginBottom = 30;  
        const marginLeft = 40;  
        const innerWidth = width - marginLeft - marginRight;  
        const innerHeight = height - marginTop - marginBottom;  
        const svg = d3.select("body").append("svg")  
            .attr("width", width)  
            .attr("height", height);  
        const plotArea = svg.append("g")  
            .attr("transform", `translate(${marginLeft},${marginTop})`);  
        const x = d3.scaleBand()  
            .domain(["Category1", "Category2", "Category3"]) 
            .padding(0.1);
        const y = d3.scaleLinear()  
            .domain([0, 100]) 
            .range([innerHeight, 0]);  
  
        // Add the x-axis.  
        plotArea.append("g")  
            .attr("transform", `translate(0,${innerHeight})`)  
            .call(d3.axisBottom(x));  
  
        // Add the y-axis.  
        plotArea.append("g")  
            .call(d3.axisLeft(y));  
        const data = [  
            { category: "Category1", value: 50 },  
            { category: "Category2", value: 75 },  
            { category: "Category3", value: 30 }  
        ];  
  
        plotArea.selectAll(".bar")  
            .data(data)  
            .enter().append("rect")  
            .attr("class", "bar")  
            .attr("x", d => x(d.category))  
            .attr("width", x.bandwidth())  
            .attr("y", d => y(d.value))  
            .attr("height", d => innerHeight - y(d.value))  
            .attr("fill", "steelblue");  
    </script>  
</body>  
</html>

 使用D3.js绘制曲线图
<!DOCTYPE html>  
<html>  
<head>  
    <title>GGBoy</title>  
</head>  
<body>  
    <div id="container" style="width: 600px; height: 400px;"></div>  
    <script type="module">  
        import * as d3 from "https://cdn.jsdelivr.net/npm/d3@7/+esm";  
  
        var data = [  
            {date: '2024-05-01', close: 100},  
            {date: '2024-05-02', close: 110},  
            {date: '2024-05-03', close: 95},  
            {date: '2024-05-04', close: 120},  
            {date: '2024-05-05', close: 105}  
        ];  
        var parseDate = d3.timeParse("%Y-%m-%d");  
        data.forEach(function(d) {  
            d.date = parseDate(d.date);  
        });  
  
        const width = 600;  
        const height = 400;  
        const marginTop = 20;  
        const marginRight = 20;  
        const marginBottom = 30;  
        const marginLeft = 40;  
  
        var x = d3.scaleTime()  
            .range([marginLeft, width - marginRight])  
            .domain(d3.extent(data, function(d) { return d.date; }));  
        var y = d3.scaleLinear()  
            .range([height - marginBottom, marginTop])  
            .domain(d3.extent(data, function(d) { return d.close; }));  
        var svg = d3.select("#container").append("svg")  
            .attr("width", width)  
            .attr("height", height);  
  
        svg.append("g")  
            .attr("transform", `translate(0,${height - marginBottom})`)  
            .call(d3.axisBottom(x));  
        svg.append("g")  
            .attr("transform", `translate(${marginLeft},0)`)  
            .call(d3.axisLeft(y));  
  
        var line = d3.line()  
            .x(function(d) { return x(d.date); })  
            .y(function(d) { return y(d.close); })  
            .curve(d3.curveBasis);  
   
        svg.append("path")  
            .datum(data)  
            .attr("class", "line")  
            .attr("d", line)  
            .attr("stroke", "blue")  
            .attr("stroke-width", 2)  
            .attr("fill", "none");   
    </script>  
</body>  
</html>

 使用D3.js实现网页时钟
<!DOCTYPE html>  
<html lang="zh">  
<head>  
    <meta charset="UTF-8">  
    <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    <title>GGBoy</title>  
    <script src="https://cdn.jsdelivr.net/npm/d3@7"></script>  
    <style>  
        .time {  
            font-family: Cursive;  
            font-size: 40px;  
            stroke: black;  
            stroke-width: 2;  
            fill: none; 
        }  
    </style>  
</head>  
<body>  
    <svg width="600" height="400"></svg> 
    <script>  
        function getTime() {  
            var time = new Date();  
            var hour = time.getHours();  
            var minute = time.getMinutes();  
            var second = time.getSeconds();  
            hour = hour < 10 ? '0' + hour : hour;
            minute = minute < 10 ? '0' + minute : minute;  
            second = second < 10 ? '0' + second : second;  
            return hour + ':' + minute + ':' + second;  
        }  
        var svg = d3.select("svg"); // 选择SVG元素  
        var timeText = svg.append("text")    
            .attr("x", 100)    
            .attr("y", 100)    
            .attr("class", "time")  
            .text(getTime());  
        function updateTime() {  
            timeText.text(getTime());  
        }  
        setInterval(updateTime, 1000);  
    </script>  
</body>  
</html>

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

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

相关文章

LeetCode 110.平衡二叉树(Java/C/Python3/Go实现含注释说明,Easy)

标签 树深度优先搜索递归 题目描述 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡的二叉树定义为&#xff1a; 一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 原题&#xff1a;LeetCode 110.平衡二叉树 思路及…

设计模式之组合实体模式

在编程的奇幻森林里&#xff0c;树木与枝叶错综复杂&#xff0c;如何让代码世界井然有序&#xff1f;组合实体模式&#xff08;Composite Pattern&#xff09;就像一位高明的园艺师&#xff0c;它以一种巧妙的方式&#xff0c;将个体与整体统一管理&#xff0c;让无论是单个对象…

Android使用kts上传aar到JitPack仓库

Android使用kts上传aar到JitPack 之前做过sdk开发&#xff0c;需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护&#xff0c;本文是讲解上传到JitPack的方式,使用KTS语法&#xff0c;记录使用过程中遇到的一些坑. 1.创建项目(library方式) 由于之前用鸿神的w…

关于Clion开发stm32printf重定向问题简单解决问题方法

title: 关于Clion开发stm32printf重定向问题简单解决问题方法 tags: STM32Clion 参考来源1 这是另一种方法 在printf 重定向的基础上加上 一句 setbuf(stdout,NULL); 参考来源2 自己写的笔记啦

深入理解vector 【C++】

一、vector的介绍&#xff1a; 1.vector是表示可变大小的顺序容器。 2.就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&am…

国产化改造之容器迁移指导(未完)

一、背景 信创即信息技术应用创新的简称,涵盖了国产软件、国产芯片以及云计算等各个方向,也可以理解为常说的“ZZKK(自主可控)”, ZZKK是指对国内企事业单位应用系统中关键软硬件部件的安全性、可靠性、性能稳定性、安全接入等方面进行评估和测试的过程。信创的发展核心就…

一对一WebRTC视频通话系列(二)——websocket和join信令实现

本系列博客主要记录WebRtc实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客&#xff1a; 一对一WebRTC视频通话系列&#xff08;一&#xff09;—— 创建页面并显示摄像头画面 websocket和join信令…

下载Node.js及其他环境推荐nvm

文章目录 项目场景&#xff1a;下载Node.js环境配置配置环境变量 安装脚手架安装依赖安装淘宝镜像安装 cnpm&#xff08;我需要安装&#xff09;nvm 安装 Node.js &#xff08;推荐&#xff09; 项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目…

Java毕业设计 基于SSM SpringBoot vue宠物领养平台

Java毕业设计 基于SSM SpringBoot vue宠物领养平台 SSM 宠物领养平台 功能介绍 首页 图片轮播 新闻信息 新闻类型 新闻详情 宠物百科 宠物百科类型 宠物百科详情 宠物 宠物类型 宠物详情 立即领养 留言 论坛 发布帖子 登录 个人中心 宠物收藏 宠物领养订单 后台管理 登录注…

pymeshlab创建给定水平半径、垂直半径和水平细分以及垂直细分的圆环并保存(torus)

一、关于环境 请参考&#xff1a;pymeshlab遍历文件夹中模型、缩放并导出指定格式-CSDN博客 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 # pymeshlab需要导入&#xff0c;其一般被命名为ml import pymeshlab as ml# 首先需…

TCP重传机制——快速重传

TCP 有一种快速重传机制&#xff0c;它不以时间为驱动&#xff0c;而是以数据驱动重传。 在上图&#xff0c;发送方发出了 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 份数据&#xff1a; 第一份 Seq1 先送到了&#xff0c;于是就 Ack 回 2&#xff1b;结果 Seq2…

Nutch库入门指南:利用Java编写采集程序,快速抓取北京车展重点车型

概述 在2024年北京车展上&#xff0c;电动汽车成为全球关注的焦点之一。这一事件不仅吸引了全球汽车制造商的目光&#xff0c;也突显了中国市场在电动汽车领域的领先地位。117台全球首发车的亮相&#xff0c;其中包括30台跨国公司的全球首发车和41台概念车&#xff0c;彰显了中…

buuctf-misc-26.后门查杀

26.后门查杀 题目&#xff1a;火绒D盾查杀关键文件获取flag 下载完文件&#xff0c;我们可以用火绒进行查杀后门&#xff0c;一般解压后&#xff0c;火绒会自动查杀到病毒文件 病毒查杀-自定义查杀 找到了需要注意的文件&#xff0c;用vscode打开这个html,可以发现和md5比较相…

【副本向】Lua副本逻辑

副本生命周期 OnCopySceneTick() 子线程每次心跳调用 --副本心跳 function x3323_OnCopySceneTick(elapse)if x3323_g_IsPlayerEnter 0 thenreturn; -- 如果没人进入&#xff0c;则函数直接返回endif x3323_g_GameOver 1 thenif x3323_g_EndTick > 0 thenx3323_CountDown…

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本&#xff1a;20.11.1 pnpm版本&#xff1a;9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8、redis(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便&#xff0c;不影响系统整体&#xff0c;和前面虚拟环境有异曲同工之妙&#xff0c;今天把老笔记本T400拿出来装了个ubuntu24…

【分布式系统】FLP、CAP、BASE、ACID理论简介

分布式系统一致性模型 在说FLP&#xff0c;CAP&#xff0c;BASE&#xff0c;ACID理论前&#xff0c;必须先说说分布式系统的一致性模型&#xff0c;它是其他理论的基础知识。 依次介绍几个相关的概念&#xff1a; 分布式系统是由多个不同的服务节点组成&#xff0c;节点与节…

VMware虚拟机安装Linux(CentOS)【超详细】

参考大佬文章&#xff1a;VMware虚拟机安装Linux教程(超详细)_vmware安装linux虚拟机-CSDN博客 目录 一、获取映射文件 二、新建虚拟机 三、安装操作系统 四、切换系统用户 一、获取映射文件 参考大佬文章获取映射文件&#xff0c;以及对应修改后缀名的方法 二、新建虚拟…

电阻 电容 电感

电阻理论基础 电阻定义 电阻决定式 温度对电阻的影响 一般电阻都是在-200-500ppm这个范围内 电阻选型 贴片电阻的标值 数字位数 3位和4位 字母R 除了数字和字母R的其他标注 需要查表 电阻精度 电阻功率和温度的关系 电阻的额定电压 零欧姆电阻 零欧姆电阻又称为跨…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 当我们点击 submit 提…