HTML怎么做弦图效果_html弦图chord diagram实现【含示例】

冬墨酱_8248

冬墨酱_8248

2026-05-14

194人浏览

原创

最靠谱的弦图实现方案是d3.js(v6/v7),需用svg容器、方阵数据格式,经d3.chord()转换后由d3.ribbon()和d3.arc()渲染;预处理须构建索引映射并合并重复项,着色应基于source.name而非index或value,响应式需靠viewbox而非动态resize重绘。

html怎么做弦图效果_html弦图chord diagram实现【含示例】

Chord diagram 用 D3.js 实现最靠谱

纯 HTML/CSS 做不出真正的弦图(chord diagram),它本质是 SVG 图形 + 数据驱动的弧线与连线计算。浏览器里能稳定落地的方案只有 D3.js(v6/v7),其他库如 Chart.js、ECharts 都不原生支持 chord diagram。

关键不是“怎么画线条”,而是怎么把矩阵数据转成 d3.chord() 能吃的格式,再喂给 d3.ribbon() 和 d3.arc() 渲染。

  • 必须用 <svg></svg> 容器,不能靠 div + border-radius 模拟
  • 数据得是方阵:行和列代表同一组实体(比如国家→国家贸易额),matrix[i][j] 表示从 i 到 j 的流向值
  • 别直接传原始数值——d3.chord() 内部会自动归一化角度,但要求所有值 ≥ 0

数据预处理最容易卡在 matrix 格式上

常见错误是把 CSV 或 JSON 扁平列表(如 [{from:"A",to:"B",value:12}])直接塞进 d3.chord(),结果渲染空白或报 Cannot read property 'length' of undefined。

正确做法是先生成索引映射,再填方阵:

const names = ["A", "B", "C"];
const matrix = Array(names.length).fill().map(() => Array(names.length).fill(0));
// 填值:A→B 是 12,就 matrix[0][1] = 12;
// 注意:chord diagram 默认显示双向,若只要单向,另一侧留 0

如果原始数据含重复关系(比如 A→B 出现多次),务必先 reduce 合并;否则 d3.chord(matrix) 会把每个重复项当独立扇区,角度炸开。

ribbon 连线颜色不跟着 source 走?检查 fill 属性绑定逻辑

默认 chord diagram 的连线(ribbon)颜色由 source 扇区决定,但很多人写成 .attr("fill", d => color(d.source.index)),结果所有 ribbon 都一个色——因为 d.source 和 d.target 是对象,不是原始索引。

Wechat HTML Publisher
Wechat HTML Publisher

直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。

下载

正确取色方式:

.attr("fill", d => color(names[d.source.index])) // 用 names 数组查名
// 或更稳一点:
.attr("fill", d => color(d.source.name || names[d.source.index]))
  • 别用 d.source.value 上色——那是流向值,不是分类标识
  • 如果用了 d3.chord().padAngle(0.02),记得同步调大 arc 的内半径,否则 ribbon 两端悬空
  • 鼠标悬停高亮时,推荐同时过渡 source arc、target arc 和 ribbon,用 d3.transition().duration(300) 统一控制

响应式缩放时 chord 图变形?svg viewBox 是关键

直接设 svg.style("width", "100%") 会导致 chord 弧线被拉伸,因为默认 preserveAspectRatio="xMidYMid meet" 在宽高比变化时会裁剪。

解法是固定 viewBox 并让 svg 自适应容器:

const width = 600, height = 600, radius = Math.min(width, height) / 2;
svg.attr("viewBox", `0 0 ${width} ${height}`)
   .style("width", "100%")
   .style("height", "auto");

后续所有坐标(arc.centroid()、ribbon.centroid())都基于这个 radius 计算,不要用 getBoundingClientRect() 动态读宽高——D3 的比例尺和路径生成器依赖静态尺寸。

真要适配移动端,建议在 CSS 里用 @media 控制 width,而不是在 JS 里监听 resize 重绘——chord diagram 的 layout 计算开销不小,频繁重算会卡顿。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

html

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2929

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2208

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1180

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1118

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1316

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2058

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3240

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

14395

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

529

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 219人学习