D3JS 画布缩放与平移(修改d3默认事件(进阶):按住轮滑为平移,滚动轮滑为缩放)

【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom) 缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行。 阅读详情

目录

效果图

实现逻辑

1、创建一个SVG容器:

2、创建一个主分组:

3、添加背景:

4、定义缩放和平移行为:

5、应用缩放和平移行为:

6、定义鼠标事件:

7、事件监听

完整代码


 D3.js绘图工具系列文章总提纲:【传送门】

默认事件:鼠标左键为平移,滚动轮滑为缩放:【传送门】

效果图

实现逻辑

通过修改 mousedown、mousemove与mouseup事件实现。

1、创建一个SVG容器:

使用d3.js创建一个SVG容器(h5代码中须有相关id标签),用于呈现图表和图形;

let svg = reactive({});

// 生成画布的dom节点id为d3Canvas;须在html代码中添加
svg = d3
    .select('#d3Canvas')
    .append("svg")
    .attr("id", "svg")
    .attr("width", 500)
    .attr("height", 500)
    .attr("viewBox", "0 0 500 500");

2、创建一个主分组:

使用d3.js对所创建的SVG容器,添加一个g标签,用于控制整体缩放;不将事件直接绑定于svg上,是因为会出现bug:画面呈现出一闪一闪的,解决方案是将所有元素使用g标签进行包裹。

let g = reactive({});

g = svg.append("g").attr("id", "svg-grid");

3、添加背景:

用于让拖拽缩放效果更明显;

g.insert("rect", ":first-child")
    .attr("width", "100%")
    .attr("height", "100%")
    .attr("fill", "url(#grid)");

// 使用网格样式填充 SVG 元素背景
var pattern = svg.insert("defs", ":first-child")
    .append("pattern")
    .attr("id", "grid")
    .attr("width", 20)
    .attr("height", 20)
    .attr("patternUnits", "userSpaceOnUse");

// 添加网格线
pattern.append("path")
    .attr("d", "M 20 0 L 0 0 0 20")
    .attr("stroke", "lightgray")
    .attr("stroke-width", 0.5)
    .attr("fill", "none");

4、定义缩放和平移行为:

使用d3.zoom()函数创建一个缩放和平移行为,可以通过设置缩放比例和平移偏移量来控制缩放和平移的效果;

function zoomed(event, svg) {
    // 对g进行偏移赋值
    g.attr("transform", event.transform);
}
var zoom = d3
    .zoom()
    .scaleExtent([0.3, 10])
    .on("zoom", (event) => zoomed(event));

5、应用缩放和平移行为:

将缩放和平移行为应用到SVG容器上,使得图表可以响应鼠标事件。
注:添加阻止鼠标落下默认事件。

svg.call(zoom).on("mousedown.zoom", null);

6、定义鼠标事件:

参数定义:

let isPanning = false;
let startX = 0, startY = 0;

鼠标落下事件(mousedown):

function panMouseDown(event) {
    if (event.button !== 1) return; // 中键按下
    console.log('中键按下');
    isPanning = true;
    [startX, startY] = d3.pointer(event);
}

鼠标移动事件(mousemove):

function panMouseMove(event) {
    if (isPanning) {
        event.preventDefault();
        const [x, y] = d3.pointer(event);
        const transform = d3.zoomTransform(g.node()); // 获取当前变换

        // 方法一 推荐
        const transformedX = (x - startX) / transform.k;
        const transformedY = (y - startY) / transform.k;
        zoom.translateBy(g, transformedX, transformedY); // 使用偏移量进行平移
        startX = x; // 更新起始位置
        startY = y;
    }
}

方法二为通过 translateTo 方法控制,但是相比于方法一,存在卡顿现象:

// 方法二
if (startX!== x || startY!== y) {
    // 使用偏移量进行平移
    zoom.translateTo(g, startX, startY, [x, y]); 
}

 鼠标抬起事件(mouseup):

function panMouseUp() {
    if (isPanning) {
        isPanning = false;
    }
}

7、事件监听

svg.on("mousedown", function (event) {
    panMouseDown(event);
});
svg.on("mousemove", function (event) {
    panMouseMove(event);
});
svg.on("mouseup", function (event) {
    panMouseUp(event);
});

完整代码

let svg = reactive({});

// 生成画布的dom节点id为d3Canvas;须在html代码中添加
svg = d3
    .select('#d3Canvas')
    .append("svg")
    .attr("id", "svg")
    .attr("width", 500)
    .attr("height", 500)
    .attr("viewBox", "0 0 500 500");

let g = reactive({});

g = svg.append("g").attr("id", "svg-grid");

g.insert("rect", ":first-child")
    .attr("width", "100%")
    .attr("height", "100%")
    .attr("fill", "url(#grid)");

// 使用网格样式填充 SVG 元素背景
var pattern = svg.insert("defs", ":first-child")
    .append("pattern")
    .attr("id", "grid")
    .attr("width", 20)
    .attr("height", 20)
    .attr("patternUnits", "userSpaceOnUse");

// 添加网格线
pattern.append("path")
    .attr("d", "M 20 0 L 0 0 0 20")
    .attr("stroke", "lightgray")
    .attr("stroke-width", 0.5)
    .attr("fill", "none");

function zoomed(event, svg) {
    // 对g进行偏移赋值
    g.attr("transform", event.transform);
}

var zoom = d3
    .zoom()
    .scaleExtent([0.3, 10])
    .on("zoom", (event) => zoomed(event));

g.call(zoom).on("mousedown.zoom", null);

let isPanning = false;
let startX = 0, startY = 0;

function panMouseDown(event) {
    if (event.button !== 1) return; // 中键按下
    console.log('中键按下');
    isPanning = true;
    [startX, startY] = d3.pointer(event);
}

function panMouseMove(event) {
    if (isPanning) {
        event.preventDefault();
        const [x, y] = d3.pointer(event);
        const transform = d3.zoomTransform(g.node()); // 获取当前变换

        // 方法一 推荐
        const transformedX = (x - startX) / transform.k;
        const transformedY = (y - startY) / transform.k;
        zoom.translateBy(g, transformedX, transformedY); // 使用偏移量进行平移
        startX = x; // 更新起始位置
        startY = y;
    }
}

function panMouseUp() {
    if (isPanning) {
        isPanning = false;
    }
}

svg.on("mousedown", function (event) {
    panMouseDown(event);
});
svg.on("mousemove", function (event) {
    panMouseMove(event);
});
svg.on("mouseup", function (event) {
    panMouseUp(event);
});

感谢阅读!在您离开之前,不妨留下您的足迹:

👍 点个赞,让我知道您喜欢这篇文章!

📝 有任何想法、建议或问题?欢迎在下方评论区分享您的想法!

🔁 分享给您的朋友们,让更多人受益!

💌 喜欢我的内容?立即订阅我的博客,获取更多精彩内容!

谢谢您的支持与参与,让我们一起创造更好的内容体验!

D3.js的V5版本-Vue框架中使用(第一章) ---SVG基础 1.基本概念viewport: 物理窗口viewbox: 实物窗口preserveAspectRatio: 保留横纵比(1) .viewport: 物理窗口 用 x,y,width,height。这 4 个属性,在页面上固定的矩形区域(2).viewbox: 实物窗口定义 SVG 元素在 viewport 中的具体尺寸比例列如:<svg width="500" height="200" vi... 阅读详情

相关推荐

vue使用svg文件补充-svg放大缩小操作(使用d3.js)

主要介绍了vue使用svg文件补充-svg放大缩小操作(使用d3.js),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

d3.js中的zoom缩放

d3.js中的zoom缩放 2019-10-24阅读721今日6 d3.js中的缩放(zoom)是一个很重要的概念,今天来看看zoom的常见用法: d3.js中zoom常见用法(二维码) scaleExtent 先用d3.zoom初始化一个zoom,然后用scaleExtent去设置它的缩小,放大的范围: constzoom=d3.zoom() .scaleExtent([1,40]) .on("zoom",zoomed); 上面设置的是最小为原始大小,最大可以放...

cxu123321的博客 1万+

d3.js实现图形缩放平移

主要为大家详细介绍了d3.js实现图形缩放平移效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

D3.js的放大,缩小和平移功能:

D3.js的放大,缩小和平移功能: d3的版本放上 "d3": "^7.0.0", 做这块功能的时候绞尽脑汁想了半天,觉得这块功能实现挺复杂的,在网上找了很多方式,结果由于d3版本的原因,好多没有生效,后来看了一晚上官方文档,以及别人的使用,最终给实现出来了 const svg = d3 .select("#container5") .append("svg") .attr("id", "svg") .attr("width", 640)

m0_52518047的博客 3842

AutoDock Vina多配体对接 (Simultaneous Multiple Ligand Docking)

多配体分子对接(Simultaneous Multiple Ligand Docking, SMLD)或(Multiple Ligand Simultaneous Docking, MLSD)是一种分子对接技术,用于将多个配体(小分子药物候选物)同时对接到一个蛋白质分子的结合位点。与传统的分子对接技术不同,传统方法通常只考虑一个配体与一个蛋白质的相互作用。SMLD的目标是更高效地研究多个配体如何与同一个蛋白质相互作用,以寻找潜在的药物候选物。

MurphyStar的博客 7146

蓝牙开发那些事之ceva controller代码解读

对比ceva的经典蓝牙和ble的controller在软件上的差异点

袁赟的博客 1092

d3.js 实现svg 缩放 平移 旋转

使用d3.js的时候,可能会需要对生成svg对象进行平移,旋转,缩放等操作 可以使用矩阵变换来进行坐标系下的转化,但是矩阵运算相对复杂。d3提供了相应的svg变换接口。 包括: translate() , scale() , rotate() , skewX() , and skewY() 一、translate() 平移操作 2个参数,第一个参数是向右平移的像素,第二个是向下

Imba 1万+

HFSS仿真3dB微带双分支定向耦合器学习笔记

设计一个3dB微带双分支定向耦合器,各端口微带线特性阻抗为50Ω,中心频率为5GHz,介质基板的介电常数9.6,基板厚度为0.8mm这里重点讲解HFSS的操作,关于理论知识后面文章更新。

qq_36521926的博客 7770

d3.js学习笔记vue2(3)使用zoom进行缩放和平移

zoom从字面上看是缩放的意思,但是d3中的zoom除了能缩放,还能平移,因为这两个操作总是不分家的 首先,整个显示区域中并不是所有的元素都要缩放和平移的,比如坐标轴、背景,这些都是不需要缩放和平移的,所以在设定zoom元素时,需要将其排除。最好的办法是使用svg的g标签对图形元素进行分组,把需要缩放的放在一个g标签里,其他的可以放在一个g标签里,也可以分开放。 在本示例代码中svgGraph...

silent_missile的博客 1万+

飞凌OK3588-C Linux R4系统下MIPI YUV摄像头CSI尺寸错误排查与极性适配方案

本文详细介绍了在飞凌OK3588-C平台的Linux R4系统下调试MIPI YUV摄像头时遇到的'csi size err'错误排查与极性适配方案。通过分析信号极性、驱动参数调整及FPGA协同调试,提供了从硬件检测到系统级调试的完整解决方案,帮助开发者快速解决类似问题。

bean的博客 259

一文读懂世界模型(World Model):AI的“数字大脑”,通往AGI的核心基石

世界模型正成为AI领域的关键技术,它让AI在虚拟环境中模拟物理世界规律并预测行动后果,从而减少现实试错成本。2018年Ha和Schmidhuber提出的VAE+RNN架构奠定基础,2022年后自监督学习推动快速发展。当前世界模型分为潜空间、生成式、强化学习和对象中心四大流派,已在机器人、自动驾驶、工业仿真等领域落地应用。尽管面临长时序预测误差等挑战,未来将向多模态建模、大模型融合等方向发展,成为实现具身智能和通用人工智能的核心基石。

m0_38116472的博客 808

D3JS 画布缩放与平移(默认:鼠标左键为平移,滚动轮滑为缩放)

D3JS 画布缩放与平移

Turn_to_empty的博客 2598

基于C++和Qt开发IEC104规约主站调试软件(第二章)

本章节主要讲解iec104主站软件界面设计和从站的连接功能以及部分功能代码的展示。

半青年的博客 860

D3JS 绘图工具

D3绘图工具提纲

Turn_to_empty的博客 1011

OpenClaw 源代码深度分析报告 &如何把企业自有的MCP server 工具集成到OpenClaw里? 怎样通过OpenAI 风格SDK 解析出来OpenClaw的全部的流式输出内容?

项目属性详情名称OpenClaw版本2026.3.2许可证MIT语言最低运行时包管理器pnpm主要仓库},// 注册工具// 工具实现},});// 注册命令" }),});},方面评价模块化设计⭐⭐⭐⭐⭐ 插件架构清晰,扩展性强协议设计⭐⭐⭐⭐⭐ WebSocket 协议完善,支持多种客户端多渠道支持⭐⭐⭐⭐⭐ 20+ 消息通道,覆盖主流平台安全机制⭐⭐⭐⭐ 配对认证、设备签名、权限控制完善本地优先⭐⭐⭐⭐⭐ 数据本地存储,用户完全控制项目属性详情名称OpenClaw版本。

AI天才研究院 940

Windows 11 安装 Miniforge,配置国内源

本文详细介绍了在 Windows 11 系统中安装 Miniforge 的完整流程,包括下载、安装选项设置、配置国内镜像源(如清华大学源)以加速包管理,并启用 mamba 提升依赖解析与安装速度。同时涵盖 conda 与 mamba 的基本使用验证、PowerShell 初始化及环境提示符优化,帮助用户快速搭建高效、开源、免费的 Python 科学计算环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 4523

D3利用viewBox属性等比例缩放SVG图像

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33824363的博客 1248

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

d3.js操作svg

最近有个需求需要用d3来操作svg文件实现svg的缩放及拖拽,同时可以在svg上打点,并对点位进行拖拽,记录下实现过程。 d3版本用的是d3.v2.js 具体代码如下: /* *svg拖拽和缩放 *.scale (1.0)默认缩放为1 *.scaleExtent([1, 5])缩放比例尺区间 */ var zoom = d3.behavior.zoom().translate([0, 0]).scale (1.0).scaleExtent([1, 5]).on("zoom", zoomed);

sddan的专栏 2359

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

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

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

D3.JS v5 画矩阵图

index.html文件内容 // 基础参数 const matrixWidth = 650; const matrixHeight = 650; var margin = { top: 70, left: 70, right: 40, bottom: 40 }; var textFontSize = 10; var linkObj = {}, nodeObj = {}; const matrixSvg = d3.select("#matrix-chart")

a2791897673的博客 1203

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

js(事件) d3

1.一些DOM属性   document里的查询方法,首先getEmentById(),getEmentsByTagName(),getEmentsByName(), 分别返回带有指定ID的元素,返回包含指定标签的所有元素节点列表,返回包含带有指定类名的所有元素的节点列表。这里的Name有时候会是className。 还有一些方法html中dom属性:innerHTML-节点的文本值,这里和...

weixin_30783629的博客 133

D3.js 鼠标事件

其实我们大家都比较熟悉js原生的鼠标事件,像鼠标点击/移动等事件,因为d3归根结底是操作的dom元素,所以一样是可以使用鼠标事件的,使用selection.on()这个API即可。// 这里的this是获取到的对应的rect元素。// 这里的this是获取到的对应的rect元素。// 这里的this是获取到的对应的rect元素。// 返还的数值是一个数组,返回x y坐标。// 这一步是生成一个矩形元素。// 获取对应的rect元素。// 获取svg元素的节点。// 可以添加动画效果。

weixin_57182748的博客 1459

【d3.js】canvas下力导向图的缩放平移和拖拽兼容

这个周零散解决了一些的关于d3问题,算是入了门,因而写了博客,顺便也作为周报的内容,所以篇幅会比正常我平时写的周报长很多,详细到代码层面。目前除了这次代码提到的v4,也完成了v6版本对应的代码。 1 从简单做起——html单页面文件开发 目前能找到的很多学习用的demo都是cdn方式引入,直接一个单页面html文件开发,而且出问题也能很方便定位查找,再者v6版本刚出不久,对于诸多api也是有了比较大的改动,讨论度不如有教程的v4,所以为了入门,同时为了避免要下各种各样的d3 npm包,还有考虑各种变量冲突、

qq_41841048的博客 2477

d3.js——图形缩放平移操作

缩放操作 var width = 400, height = 400; var circles =[{cx:150,cy:200,r:30}, {cx:250,cy:200,r:30}] var svg = d3.select("body").append("svg") .attr("width",wi

Selina_Chan的博客 1万+

【D3.js】使用D3.js快速实现拓扑图的绘制

D3的简介 D3 全名为 Data Drive Document,即通过 Data 操作 Document,而在做数据可视化时,Data 最常 Drive 的 Document 便是 SVG。刚了解到D3时,看到D3官网非常丰富且酷炫的Demo,便觉得 D3 应该有着无限可能的图形开发能力,所以在学习完基础的API和SVG的基础后,就开始着手绘制D3的节点拓扑图了; 绘制简易的可拖拽节点拓扑图 2.1 准备工作: 安装D3: npm install d3 --save 项目中导入D3: imp.

节省钱的博客 1万+

[数据可视化]d3js源码,selection(四)添加事件,控制流,局部变量

selection模块结构 选择元素 修改元素 加入数据 处理事件(本章的内容) 控制流(本章的内容) 局部变量(本章的内容) 命名空间 事件处理 出于交互考虑,selection支持监听(listening)和分派(dispatching)事件。 selection.on(typenames[, listener[, options]]) 根据typenames向元素添加或删除事件监听,类型...

Dosth_Magic 1191

Unity3D:从零构建高效关卡编辑器的实战指南

本文是一份Unity3D关卡编辑器从零构建的实战指南。针对关卡密集型游戏开发痛点,详细阐述了如何设计核心数据结构、实现场景交互与物件操控、优化用户界面与工作流,并打通编辑数据与游戏运行时的链路。通过构建定制化关卡编辑器,开发者能将关卡创作权交还给策划与美术,大幅提升团队内容迭代效率与生产力。

moss5的博客 726
上一篇: D3JS 实例化
下一篇: D3JS 实现画笔效果(svg)
HahaMonsters
博客等级 码龄8年 2324粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值