D3 二维图表的绘制系列(十二)基础散点图

如何利用D3.js绘制一个简单的散点图 首先保证你的包中引入了d3.js文件,我这里用的是d3.v3.js这个版本 接下来可以开始写你的程序了 要在网页上绘制散点图,我们需要用到SVG(不清楚SVG概念的请点击 这里 学习) 1.定义画布 //这里我们随意定义一些散点坐标 var dataset = [[5,10],[10,8],[15,18],[20,11],[25,15],[30,20]]; //设定画布宽度 var 阅读详情

上一篇: 南丁格尔图 https://blog.youkuaiyun.com/zjw_python/article/details/98480980

下一篇: 多符号散点图 https://blog.youkuaiyun.com/zjw_python/article/details/98483989

代码结构和初始化画布的Chart对象介绍,请先看 https://blog.youkuaiyun.com/zjw_python/article/details/98182540

本图完整的源码地址: https://github.com/zjw666/D3_demo/tree/master/src/scatterChart/basicScatterChart

1 图表效果

在这里插入图片描述

2 数据

x,y
24,12
39,20
78,15
15,80
36,70
7,11
36,13
34,89
9,95
72,35
26,65
16,36
99,65
46,78
85,42
32,14
43,12
73,95
8,6
81,62

3 关键代码

导入数据

d3.csv('./data.csv', function(d){
    return {
        x: +d.x,
        y: +d.y
    };
}).then(function(data){
....

一些样式参数配置

const config = {
        pointColor: chart._colors(0),
        margins: {top: 80, left: 80, bottom: 50, right: 80},
        textColor: 'black',
        gridColor: 'gray',
        ShowGridX: [10, 20, 30, 40, 50, 60, 70 ,80, 90, 100],
        ShowGridY: [10, 20, 30, 40, 50, 60, 70 ,80, 90, 100],
        title: '散点图',
        pointSize: 5,
        hoverColor: 'white',
        animateDuration: 1000
    }

尺度转换,与基础柱状图类似,基础散点图也有X和Y两个轴,且两个轴都是连续的类型

/* ----------------------------尺度转换------------------------  */
    chart.scaleX = d3.scaleLinear()
                    .domain([0, Math.ceil(d3.max(data, (d) => d.x)/10)*10])
                    .range([0, chart.getBodyWidth()])
    
    chart.scaleY = d3.scaleLinear()
                    .domain([0, Math.ceil(d3.max(data, (d) => d.y)/10)*10])
                    .range([chart.getBodyHeight(), 0])

渲染数据点,很简单,用circle元素就可以了

/* ----------------------------渲染数据点------------------------  */
    chart.renderPoints = function(){
        let points = chart.body().selectAll('.point')
                    .data(data);

            points.enter()
                    .append('circle')
                    .classed('point', true)
                .merge(points)
                    .attr('cx', (d) => chart.scaleX(d.x))
                    .attr('cy', (d) => chart.scaleY(d.y))
                    .attr('r', 0)
                    .attr('fill', config.pointColor)
                    .transition().duration(config.animateDuration)
                    .attr('r', config.pointSize)
            
            points.exit()
                    .remove();
    }

渲染坐标轴、文本标签和网格,这些与基础柱状图几乎相同

/* ----------------------------渲染坐标轴------------------------  */
    chart.renderX = function(){
        chart.svg().insert('g','.body')
                .attr('transform', 'translate(' + chart.bodyX() + ',' + (chart.bodyY() + chart.getBodyHeight()) + ')')
                .attr('class', 'xAxis')
                .call(d3.axisBottom(chart.scaleX));
    }

    chart.renderY = function(){
        chart.svg().insert('g','.body')
                .attr('transform', 'translate(' + chart.bodyX() + ',' + chart.bodyY() + ')')
                .attr('class', 'yAxis')
                .call(d3.axisLeft(chart.scaleY));
    }

    chart.renderAxis = function(){
        chart.renderX();
        chart.renderY();
    }

    /* ----------------------------渲染文本标签------------------------  */
    chart.renderText = function(){
        d3.select('.xAxis').append('text')
                            .attr('class', 'axisText')
                            .attr('x', chart.getBodyWidth())
                            .attr('y', 0)
                            .attr('fill', config.textColor)
                            .attr('dy', 30)
                            .text('X');

        d3.select('.yAxis').append('text')
                            .attr('class', 'axisText')
                            .attr('x', 0)
                            .attr('y', 0)
                            .attr('fill', config.textColor)
                            .attr('dx', '-30')
                            .attr('dy', '10')
                            .text('Y');
    }

    /* ----------------------------渲染网格线------------------------  */
    chart.renderGrid = function(){
        d3.selectAll('.yAxis .tick')
            .each(function(d, i){
                if (config.ShowGridY.indexOf(d) > -1){
                    d3.select(this).append('line')
                        .attr('class','grid')
                        .attr('stroke', config.gridColor)
                        .attr('x1', 0)
                        .attr('y1', 0)
                        .attr('x2', chart.getBodyWidth())
                        .attr('y2', 0);
                }
            });

        d3.selectAll('.xAxis .tick')
            .each(function(d, i){
                if (config.ShowGridX.indexOf(d) > -1){
                    d3.select(this).append('line')
                        .attr('class','grid')
                        .attr('stroke', config.gridColor)
                        .attr('x1', 0)
                        .attr('y1', 0)
                        .attr('x2', 0)
                        .attr('y2', -chart.getBodyHeight());
                }
            });
    }

绑定鼠标交互事件,鼠标悬停时显示坐标值

/* ----------------------------绑定鼠标交互事件------------------------  */
    chart.addMouseOn = function(){
        //防抖函数
        function debounce(fn, time){
            let timeId = null;
            return function(){
                const context = this;
                const event = d3.event;
                timeId && clearTimeout(timeId)
                timeId = setTimeout(function(){
                    d3.event = event;
                    fn.apply(context, arguments);
                }, time);
            }
        }

        d3.selectAll('.point')
            .on('mouseover', function(d){
                const e = d3.event;
                const position = d3.mouse(chart.svg().node());
                e.target.style.cursor = 'hand'

                d3.select(e.target)
                    .attr('fill', config.hoverColor);
                
                chart.svg()
                    .append('text')
                    .classed('tip', true)
                    .attr('x', position[0]+5)
                    .attr('y', position[1])
                    .attr('fill', config.textColor)
                    .text('x: ' + d.x + ', y: ' + d.y);
            })
            .on('mouseleave', function(){
                const e = d3.event;
                
                d3.select(e.target)
                    .attr('fill', chart._colors(0));
                    
                d3.select('.tip').remove();
            })
            .on('mousemove', debounce(function(){
                    const position = d3.mouse(chart.svg().node());
                    d3.select('.tip')
                    .attr('x', position[0]+5)
                    .attr('y', position[1]-5);
                }, 6)
            );
    }

大功告成!!!


如果觉得这篇文章帮助了您,请打赏一个小红包鼓励作者继续创作哦!!!

在这里插入图片描述

Echarts绘制散点地图 Echarts绘制散点地图 1.显示一个地理坐标系geo,以及显示省份 geo:{ map:"china", label:{ show:true },} 2.与地图进行绑定 coordinateSystem: 'geo', 3.完整代码 <!DOCTYPE html> <html lang="en"> <head> <meta char 阅读详情

相关推荐

【vue】Echarts3D地图下钻

地图下钻是一个非常常见的功能需求,本篇文章会细致讲解如何在Vue3中使用Eharts-gl渲染出3D地图,并且实现地图下钻和返回上级地图的完整功能。

m0_68324632的博客 1万+

【D3.js数据可视化系列教程】--(十一)散点图

散点图

司机大傻 1万+

D3 二维图表的绘制系列(一)介绍

1 介绍 D3 (或者叫 D3.js )是一个基于 web 标准的 JavaScript 可视化库. D3 可以借助 SVG, Canvas 以及HTML 将你的数据生动的展现出来. D3 结合了强大的可视化交互技术以及数据驱动 DOM 的技术,让你可以借助于现代浏览器的强大功能自由的对数据进行可视化 学习了d3一个多月,通过绘制一些简单的二维图表,总算入门了d3。强烈推荐《D3数据可视化实战...

zjw_python的博客 6万+

d3可视化展示-brush可拖拽时间轴(可播放)+地图map

1、先看效果。如下图所示, 视频链接: 截图: 2、数据及可视化含义。 这是一个可视化demo,使用d3.js+mapbox开发,可视化了2013年1月 - 2015年12月的中国交通事故伤亡人数,数据为模拟的非真实数据; 可视化含义: 2.1、map部分,地图上的红色及橙色圆形marker表示发生事故的地点,红色表示死亡人数大于等于1,橙色代表只有受伤人员,marker的半径代表此次事故的伤亡人数总和,半径越大则伤亡人数越多;点击marker可以弹出信息窗infobox; 2.2、左下底部为b

李海洋的博客 3236

D3 二维图表的绘制系列(三十一)热力地图(heatMap.js)

上一篇: 平行坐标系折线图 代码结构和初始化画布的Chart对象介绍,请先看 这里 本图完整的源码地址: 这里 1 图表效果 2 数据 本文源码中提供了中国地图的GeoJson数据, 点击这里下载,如果想获取其他地区的数据,可参考这篇文章 3 关键代码 导入GeoJson格式的地图数据 d3.json('./china.json').then(function(data){ .... 一些简单...

zjw_python的博客 6768

【信息科学与工程学】【审计学】第一篇 招投标领域审计算法01

在每个关键流程节点(如文件上传、开标唱标、评标结束), 计算该环节所有电子文件的数字指纹(如SHA-256哈希值), 并将指纹和元数据(时间、操作人)上链存证。:从发票、合同中提取材料品名、规格、采购价、时间、地点。:对每个供应商, 提取其在历史投标中的行为序列特征, 如:中标率、与特定伙伴同时投标率、自身高报价次数、在伙伴中标项目中的“弃标”或“无效标”次数。:监控开标、评标现场音视频, 识别异常情绪(激烈争吵)、敏感关键词(“打点”、“关照”)、异常物品传递、私下交流等违规行为。

weixin_49199313的博客 815

李沐深度学习代码精讲

本文系统解析了李沐深度学习代码实践,重点涵盖PyTorch基础、线性回归、Softmax回归和感知机等核心内容。文章首先详细介绍了PyTorch环境配置、张量操作和自动求导机制,然后深入讲解了从零实现和简洁实现两种方式的线性回归模型。在Softmax回归部分,详细阐述了Fashion-MNIST数据集的加载、处理和可视化方法,以及交叉熵损失函数的实现。文章还包含了感知机模型的构建和训练过程,并探讨了模型选择、过拟合和欠拟合等关键概念。通过大量代码示例和原理说明,为读者提供全面的深度学习实践指南,适合理论学习

ExraL的博客 245

d3-stacked-scatterplot:一组基于 CSV 数据的堆叠 D3 散点图

这仍然是一项正在进行的工作。 试图获得一个基本版本,供人们开始尝试不同的数据集。 您可以找到示例。 自定义数据 修改 js/chart-progression.js 顶部的变量以匹配您的数据 使用要绘制图表的动态数据修改 data/data.csv 数据必须遵循以下格式: TIME,TYPE,SUBJECT_ID,VALUE TIME和VALUE是数字类型每个TYPE将是一个新图表SUBJECT_ID将点链接在一起 使用与上述相同的格式和标识符,使用静态数据修改 data/static.csv。 此数据中的VALUE没有数字 此数据不会被绘制成图表,而是作为右侧的过滤器存在 开发人员设置 如果您想运行 grunt(不是必需的),请使用以下。 安装节点 安装咕噜声npm install -g grunt-cli 导航到根目录 安装依赖npm install 运行 grunt 来设置

【D3使用教程】(2) 绘制柱状图与散点图

(1)绘制一幅柱状图 严格来说,柱形图是指矩形沿垂直方向度量的图形;条形图,是沿水平方向度量的图形。多数时候我们常常没有区分这两个概念。 首先我们来尝试绘制一幅柱状图。 注:开始之前,先在页面中引入jquery和d3.js文件。 &lt;style&gt; div.bar { display: inline-block; ...

前端进阶之路 | 中大厂、外企、国企内推 | 面试培训 | 简历修改 3428

d3基础 d3常用函数速查

此笔记根据D3学习网站 http://alignedleft.com/tutorials 的内容整理而来,全文主要为翻译大神原作,只在少数不易理解的地方加入了自己的理解和实例。

HarmonyOS NEXT 开发者预览版Beta招募应知测试

本次HarmonyOS NEXT 开发者预览版 Beta 招募活动为开发者预览版尝鲜升级,主要供开发者进行应用调测使用,除部分系统应用外,其他所有应用将被清除,因此在进行HarmonyOS NEXT 开发者预览版升级前,需进行数据备份。通过应知测试,并提交了参加HarmonyOS NEXT 开发者预览版招募 Beta 活动的报名信息,就会立刻审核通过并且收到新版本。手机在参加HarmonyOS NEXT 开发者预览版 Beta 招募活动前,需要对应机型升级到招募要求对应的基线版本,并预留内存空间。

长久公子的博客 8649

使用d3.js实现力矩散点图+图例

首先导入相关js依赖, 然后具体实现: .links line { stroke: #999; stroke-opacity: 0.6; } .nodes circle { stroke: #fff; stroke-width: 1.5px; } .linetext { font-size: 18px ; font-family: SimSun;

弹指天下 5431

从零到一:KUKA机械臂与ROS的工业级通讯协议深度解析

本文深度解析KUKA机械臂与ROS的工业级通讯协议,重点对比EKI与RSI两种核心接口的技术特点与应用场景。详细介绍了网络架构设计、数据包解析机制及ROS-I集成方法,并提供实时性能优化与故障排除策略,为工程师实现高可靠性工业自动化集成提供完整解决方案。

2a4s6d8f0g的博客 296

d3js mysql_使用D3.js绘制地图并打点

本篇简单介绍一下使用D3.js绘制地图,并更具经纬度在地图打点。最后根据点生成voronoi图及其三角网。下载地图geoJson文件去网上下载要绘制地图的geoJson文件。使用d3.json()加载地图文件,这里为了方便加载我把geoJson文件放在了js文件里。绘制地图window.onload = function() {var width = 1900,height = 800;var s...

weixin_35868133的博客 836

维护测试监控LLM应用

LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;调试 Prompt 的 Playground测试/验证系统的相关指标数据集管理各种指标监控与统计:访问量、响应时长、Token 费等等。

SunnyRivers 1780

【阿里云大模型高级工程师ACP学习笔记】2.8 部署模型

【摘要】本文主要分享自学阿里云大模型高级工程师 ACP 认证中《2.8 部署模型》的学习笔记。详细介绍学习目标、梳理涵盖的知识点并评估其重要性和难易度,对既重要又困难的知识点进行重点分析,旨在为对阿里云大模型学习和认证感兴趣的读者提供学习思路和经验参考。

davidkorhenn的博客 2060

【 D3.js 高级系列 — 7.0 】 标注地点

有时需要告诉用户地图上的一些目标,如果该目标是只需要一个坐标就能表示的,称其为“标注”。1. 标注是什么标注,是指地图上只需要一个坐标即可表示的元素。例如,在经纬度(116, 39)处画一个圆,在(108, 30)处画一个符号,这些都属于标注,也可以将标注理解为“点元素”。我们知道,只知道经纬度是不能直接在地图上作图的,需要先用投影函数将其转换成像素坐标。例如,如果要在中国地图上标出“北京”的...

weixin_30821731的博客 361

300个fpga练手项目推荐

• 按键设置BPM,LED和蜂鸣器同步打拍(支持4/4、3/4拍)• 例:先实现DDR3控制器(基础),再构建视频处理流水线(集成)◦ 驱动小型e-Paper显示日期/时间(SPI接口,静态刷新)◦ 音频输入经FFT后,用LED柱状显示频率能量(8频段简化)◦ 通过HC-05模块接收手机指令,控制电机方向(前进/后退)• 随机点亮LED,用按钮响应,数码管显示反应时间(毫秒级)• 8个LED旋转闪烁,按钮停止后显示中奖编号(带减速动画)• 用4方向按键输入手势(如→→←↑),正确后点亮绿色LED。

qq_62784677的博客 7641

d3绘制地图+heatmap.js实现热力图

目录 1、背景 2、思路 3、区域图直接在一个g元素上进行绘制。 4、使用svg绘制的热力图效果不太好,因此通过引入heatmap.js进行绘制。 5、参考资料 1、背景 有个需求,希望在地图上展示数据的区域图和热力图。通过切换来改变展示形式。 angular: 6.1.0 d3: 5.0.0 heatmap: 2.0 2、思路 由于是使用d3绘制的地图,且请求的...

pgLi 1万+

innovus:sroute 双层follow pin的做法

根据std cellpower pin的层次可以分成两种情况。

m0_61544122的博客 2731

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

R语言使用rms包的psm函数拟合参数生存模型(parametric survival model)、并可视化列线图(诺模图、nomogram)

statistics+insight+vista+power 903

D3.js数据可视化(三)——地图可视化

地图可视化 1. 实验要求 本实验要求按照实验要求,在地图可视化的基础上设计可视化方案,并利用D3工具实现可视化效果 2. 过程 2.1 可视化方案的设计思路 2.1.1 可视化要求   1) 基于地图信息,设计可视化方案;   2) 能够将不同州的生产力高低,以及一些城市的人口多少表示在地图上;   3) 能为用户提供一个分析在那些生产力比较高(或比较低)的州...

weixin_30644369的博客 2731

ABAP SQL Hierarchy 全景参考,组织树、分类树与递归查询在数据库层的优雅落地

ABAP SQL中的hierarchy语法为树形数据结构处理提供了高效方案。S/4HANA系统中常见的成本中心、利润中心、物料分类等树形结构,传统开发需通过递归和嵌套循环处理,而ABAP SQL hierarchies通过将层级遍历能力下沉到SQL层,借助SAP HANA的层级函数支持,实现了更高效的查询。 该功能要求ABAP 7.51+版本,支持两种实现方式:CDS hierarchy用于创建可复用的稳定层级模型,适合业务核心数据;ABAP SQL HIERARCHY generator则适用于临时性层级

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 313

d3.js绘制地图,支持点击等事件

目前项目中遇到的需求是画出一个静态地图,并支持一些基本的点击事件,此次是使用d3.js制作的(d3真的从入门到放弃了),话不多说直接上代码吧,可以直接复制下来就可以用的。一些扩展的功能大家可以自由发挥,d3.js官网(

weixin_57182748的博客 1857

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

d3.js学习笔记(三)------散点图(添加了数轴)

添加了数轴的散点图 要点: 1、定义数轴时是用 d3.axisBottom()、 d3.axisLeft() 2、数轴是要基于比例尺工作,所以必须调用 .scale(比例尺) 3、ticks() 是用来定义刻度线的数量,但只是粗略设置刻度线的数量,d3 会更精确的确定具体采用几根刻度线 4、svg.append(“g”) g是分组元素:1)为组织其他元素;2)对整个分组应用变换,从而影响该组中所有元素 5、添加数轴,必须调用定义的数轴函数 具体代码如下: <!DOCTYPE html> <

MARTIAN的博客 595

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

d3 散点图

下定决心好好过一天 这里我的d3是v7版本,框架使用的是vue框架。可以只看methods中写的代码即可 源代码 <template> <div id="ScatterChartsD3" width="600" height="600"> </div> </template> <script> import * as d3 from "d3" export default { name:"ScatterChartsD3", .

give it a try 376

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: D3 二维图表的绘制系列(十)环状饼图
下一篇: D3 二维图表的绘制系列(十三)多符号散点图
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值