d3_v7绘制折线图

<!DOCTYPE html>
<html><head><meta charset='utf-8'><title>需求</title><script src="https://d3js.org/d3.v7.min.js"></script><style>* {margin: 0;padding: 0;}html, body {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}#graph-container {width: 50%;height: 30%;position: relative;display: flex;flex-direction: column;/*一定要加position: relative*/}#graph{width: 100%;flex: 1;}.chart-title {text-align: center;color: #333;margin-bottom: 20px;}#zhe-xian-tooltip {position: absolute;padding: 12px;background: rgba(0, 0, 0, 0.85);color: white;border-radius: 6px;pointer-events: none;font-size: 14px;font-family: sans-serif;opacity: 0;}.zhe-xian-circle{fill: #e63946;stroke: white;stroke-width: 2;transition: r 0.2s;}.zhe-xian-line {fill: none;stroke: #e63946;stroke-width: 3;stroke-linejoin: round;}</style>
</head>
<body>
<button id="myButton" style="margin-right: 40px">数据变更</button><div id="graph-container"><h2 class="chart-title">标题</h2><div id="graph"><div id="zhe-xian-tooltip"></div></div></div>
<script>const generateData = () => {return Array.from({length: Math.floor(Math.random() * 12) + 5}, (_, index) => ({time: index + 1,count: Math.floor(Math.random() * 100) // 生成0-99的随机整数}));}const drawZheXianGraph = (dataset, container, update) => {dataset.sort((a, b) => a.time - b.time);//按照月份排序console.log("绘制图形数据", dataset);const element = document.getElementById(container);const width = element.offsetWidth;  // 宽度(含 padding + border)const height = element.offsetHeight; // 高度(含 padding + border)const margin = {left: 50,right: 30,top: 30,bottom: 50}if (!update) {d3.select(`#${container}`).append('svg').attr('width', width).attr('height', height);}const svg = d3.select(`#${container}`).select('svg');//定义x轴比例尺const xScale = d3.scaleBand().domain(dataset.map(item => item.time)).range([margin.left, width - margin.right]).padding(0) // 设置柱子之间的间隙.paddingInner(1); // 设置柱子内部的间隙console.log(xScale(1), xScale(2));// 获取所有count值组成的数组const counts = dataset.map(item => item.count);const maxCount = Math.max(...counts);//定义y轴比例尺const yScale = d3.scaleLinear().domain([0, maxCount]).range([height - margin.bottom, margin.top]);//定义绘制折线的函数const line = d3.line().x(function (d) {return xScale(d.time) + xScale.bandwidth() / 2;}).y(function (d) {return yScale(d.count);})// .curve(d3.curveCardinal) //曲线.curve(d3.curveLinear) //直线const xAxis = d3.axisBottom(xScale).tickFormat(function (d, i) {return dataset[i].time;});const yAxis = d3.axisLeft(yScale);// 每个区域绘制一个矩形用于触发事件const _w = (width - margin.left - margin.right) / (dataset.length - 1);const tooltip = d3.select('#zhe-xian-tooltip');function showTooltip(event, d) {tooltip.transition().duration(200).style("opacity", 0.9);tooltip.html(`time: ${d.time}<br>count: ${d.count}`).style("left", (xScale(d.time) + xScale.bandwidth() / 2 + 10) + "px").style("top", (yScale(d.count) - 10) + "px");}function hideTooltip() {tooltip.transition().duration(500).style("opacity", 0);}if (update) {//更新x轴和y轴svg.select(".zhe-xian-x-axis").transition().duration(500).call(xAxis);svg.select(".zhe-xian-y-axis").transition().duration(500).call(yAxis)svg.selectAll(".zhe-xian-line").datum(dataset).join("path").attr("class", "zhe-xian-line").transition().duration(500).attr("d", line)svg.selectAll('.zhe-xian-circle').data(dataset).join("circle").attr("class", "zhe-xian-circle").attr("r", 5).style('cursor', 'pointer').on('mouseover', showTooltip).on('mouseout', hideTooltip).transition().duration(500).attr('cx', function (d) {return xScale(d.time) + xScale.bandwidth() / 2;}).attr('cy', function (d) {return yScale(d.count);})} else {svg.append('path').datum(dataset).attr('class', 'zhe-xian-line').attr('d', line)svg.append('g').attr('class', 'zhe-xian-x-axis').attr('transform', 'translate(0,' + (height - margin.bottom) + ')').call(xAxis);svg.append('g').attr('class', 'zhe-xian-y-axis').attr('transform', 'translate(' + margin.left + ',0)').call(yAxis);// 绘制圆点svg.selectAll('.zhe-xian-circle').data(dataset).enter().append('circle').attr('class', 'zhe-xian-circle').attr('cx', function (d) {return xScale(d.time) + xScale.bandwidth() / 2;}).attr('cy', function (d) {return yScale(d.count);}).attr('r', 5)  //修改圆点大小.style('cursor', 'pointer').on('mouseover', showTooltip).on('mouseout', hideTooltip);svg.append("text").attr("class", "axis-label").attr("transform", "rotate(-90)").attr("x", -height/2).attr("y", margin.left-30).style("text-anchor", "middle").text("数量");svg.append("text").attr("class", "axis-label").attr("x", width / 2).attr("y", height-10).style("text-anchor", "middle").text("月份");}}drawZheXianGraph(generateData(), "graph", false)// 绑定点击事件document.getElementById('myButton').addEventListener('click', function () {console.log("我被点击了")drawZheXianGraph(generateData(), "graph", true)// 这里可以添加更多自定义逻辑});
</script>
</body>
</html>

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

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

相关文章

Hotspot分析(1):单细胞转录组识别信息基因(和基因模块)

这一期我们介绍一个常见的&#xff0c;高分文章引用很高的一个单细胞转录组分析工具Hotspot&#xff0c;它可针对单细胞转录组数据识别有意义基因或者基因module&#xff0c;类似于聚类模块。所谓的”informative "的基因是那些在给定度量中相邻的细胞之间以相似的方式表达…

爬虫准备前工作

1.Pycham的下载 网址&#xff1a;PyCharm: The only Python IDE you need 2.Python的下载 网址&#xff1a;python.org&#xff08;python3.9版本之后都可以&#xff09; 3.node.js的下载 网址&#xff1a;Node.js — 在任何地方运行 JavaScript&#xff08;版本使用18就可…

基于Springboot旅游网站系统【附源码】

基于Springboot旅游网站系统 效果如下&#xff1a; 系统登陆页面 系统主页面 景点信息推荐页面 路线详情页面 景点详情页面 确认下单页面 景点信息管理页面 旅游路线管理页面 研究背景 随着互联网技术普及与在线旅游消费习惯的深化&#xff0c;传统旅游服务模式面临效率低、…

利用KMP找出模式串在目标串中所有匹配位置的起始下标

问题关键&#xff1a;完成首次匹配之后需要继续进行模式匹配。 到这一步后&#xff0c;我们不能直接将j 0然后开始下一轮匹配&#xff0c;因为已经匹配过的部分&#xff08;蓝色部分&#xff09;中仍然可能存在与模式串重叠的子串&#xff1a; 解决办法&#xff1a; 找到蓝…

RR(Repeatable Read)级别如何防止幻读

在 MySQL 数据库事务隔离级别中&#xff0c;RR&#xff08;可重复读&#xff09; 通过 MVCC&#xff08;多版本并发控制&#xff09; 和 锁机制 的组合策略来避免幻读问题。 一、MVCC机制&#xff1a;快照读与版本控制 快照读&#xff08;Snapshot Read&#xff09; 每个事务启…

Android运行时ART加载类和方法的过程分析

目录 一,概述 二,ART运行时的入口 一,概述 既然ART运行时执行的都是翻译DEX字节码后得到的本地机器指令了&#xff0c;为什么还需要在OAT文件中包含DEX文件&#xff0c;并且将它加载到内存去呢&#xff1f;这是因为ART运行时提供了Java虚拟机接口&#xff0c;而要实现Java虚…

Javase 基础加强 —— 02 泛型

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 认识泛型…

Oracle VirtualBox 在 macOS 上的详细安装步骤

Oracle VirtualBox 在 macOS 上的详细安装步骤 一、准备工作1. 系统要求2. 下载安装包二、安装 VirtualBox1. 挂载安装镜像2. 运行安装程序3. 处理安全限制(仅限首次安装)三、安装扩展包(增强功能)四、配置第一个虚拟机1. 创建新虚拟机2. 分配内存3. 创建虚拟硬盘4. 加载系…

RAGFlow 接入企业微信应用实现原理剖析与最佳实践

背景 近期有医美行业客户咨询我们智能客服产品&#xff0c;期望将自己企业的产品、服务以及报价信息以企微应用的方式给到客户进行体验互动&#xff0c;提升企业运营效率。关于企业微信对接&#xff0c;我们分享下最佳实践&#xff0c;抛砖引玉。效果图如下&#xff1a; 这里也…

【心海资源】子比主题新增注册与会员用户展示功能模块及实现方法

内容改写&#xff1a; 本次分享的是子比主题顶部展示注册用户与会员信息的功能模块及其实现方式。 你可以通过两种方式启用该功能&#xff1a; 直接在后台进入“外观 → 小工具”启用该展示模块&#xff0c;操作简便&#xff1b;也可将提供的代码覆盖至子比主题目录中&#…

CSDN积分详解(介绍、获取、用途)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 积分**一、积分类型及用途****二、积分获取途…

【iview】es6变量结构赋值(对象赋值)

变量的解构赋值 以iview的src/index.js中Vue.prototype.$IVIEW改造为例练习下怎么使用变量的解构赋值 原来的写法&#xff1a; const install function(Vue, opts {}) {if (install.installed) return;locale.use(opts.locale);locale.i18n(opts.i18n);Object.keys(iview).fo…

【c++深入系列】:万字详解vector(附模拟实现的vector源码)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 种子破土时从不问‘会不会有光’&#xff0c;它只管生长 ★★★ 本文前置知识&#xff1a; 模版 1.什么是vector 那么想必大家都学过顺…

MySQL基础关键_007_DQL 练习

目 录 一、题目 二、答案&#xff08;不唯一&#xff09; 1.查询每个部门薪资最高的员工信息 2.查询每个部门高于平均薪水的员工信息 3. 查询每个部门平均薪资等级 4.查询部门中所有员工薪资等级的平均等级 5.不用分组函数 max 查询最高薪资 6.查询平均薪资最高的部门编…

Jenkis安装、配置及账号权限分配保姆级教程

Jenkis安装、配置及账号权限分配保姆级教程 安装Jenkins下载Jenkins启动Jenkins配置Jenkins入门Jenkins配置配置中文配置前端自动化任务流新建任务拉取代码打包上传云服务并运行配置后端自动化任务流新建任务拉取代码打包上传云服务并运行账号权限分配创建用户分配视图权限安装…

虚函数 vs 纯虚函数 vs 静态函数(C++)

&#x1f9e9; 一图看懂&#xff1a;虚函数 vs 纯虚函数 特性虚函数&#xff08;Virtual&#xff09;纯虚函数&#xff08;Pure Virtual&#xff09;语法virtual void foo();virtual void foo() 0;是否必须实现✅ 必须在类中实现❌ 不在基类实现&#xff0c;派生类必须实现是…

2025年渗透测试面试题总结-拷打题库36(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库36 PHP代码常见入口函数查找 PHP框架路由方法熟悉度 PHP变量覆盖…

STL之vector容器

vector的介绍 1.vector是可变大小数组的容器 2.像数组一样&#xff0c;采用连续的空间存储&#xff0c;也就意味着可以通过下标去访问&#xff0c;但它的大小可以动态改变 3.每次的插入都要开空间吗&#xff1f;开空间就要意味着先开临时空间&#xff0c;然后在拷贝旧的到新…

[学成在线]22-自动部署项目

自动部署 实战流程 下边使用jenkins实现CI/CD的流程。 1、将代码使用Git托管 2、在jenkins创建任务&#xff0c;从Git拉取代码。 3、拉取代码后进行自动构建&#xff1a;测试、打包、部署。 首先将代码打成镜像包上传到docker私服。 自动创建容器、启动容器。 4、当有代…

74HC123的电路应用场景

74HC123的电路应用场景 **1. 引脚功能示例****2. 核心功能****&#xff08;1&#xff09;单稳态触发器****&#xff08;2&#xff09;双独立通道****&#xff08;3&#xff09;灵活触发方式** **3. 工作原理****4. 典型应用场景****&#xff08;1&#xff09;定时与延时控制***…