使用 D3.js 可视化动物人气投票:体验 SVG 与平方根比例尺

プログラミング・Web開発カテゴリを表すパンダのイラスト 编程・Web开发

关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们将使用虚拟数据和浏览器操作来学习 D3.js 的用途、机制以及失败时的观察要点。不会访问实际的服务或个人信息。

验证状态:2026-10-30 将官方文档与 GitHub 固定提交的 HTML/JavaScript 进行了核对。未执行实际浏览器操作、CDN 获取以及渲染/音频输出,文中的结果均为代码的期望值。

项目内容
对象Chrome/Edge/Firefox 等现代浏览器(尚未确认真实设备兼容性)
使用的库D3.js(教程内版本:7.9.0)
费用演示源码本身不需要付费 API。通信费用和使用条件取决于运行环境
数据页面内的虚拟数据。无需认证信息、位置信息以及企业数据
学习操作每次为动物投票时,改变圆圈的大小和票数

为什么尝试这项技术

绘制图表的库有很多,但 D3.js 的特点在于能够自由构建细节表现。本次的主题是虚拟的动物人气投票,将大熊猫、猫和猫头鹰的票数以圆圈的形式展示。按下投票按钮后,圆圈变大,票数字体也会更新。这不仅是修改圆圈的大小,而是一个帮助观察数值变化如何与屏幕元素相关联的教程。在选择图表库之前,我们需要思考现成的柱状图是否足够,或者是否需要独特的视觉表达。

在制作动态示例时,不能仅停留在“界面动了”这一表象上,还必须分清“哪个输入改变了哪个变量,以及哪个处理更新了绘制”。在本节教材中,我们会将这种变化明示在屏幕上。在将其集成到实际服务中时,请另外设计认证和保存逻辑。

首先尝试:实时演示与预期结果

最初是熊猫 3 票、猫 2 票、猫头鹰 1 票的虚拟数值。给猫投一票,观察当票数与熊猫相同时圆的半径是否相等。接下来重置,使所有动物票数归零,确认即使圆不可见,各动物的名字和 0 票依然保留。屏幕下方会以文字显示总票数。只看圆形的图像很难准确读出具体的票数,因此务必同时标注数值文本,这是关键所在。

操作前需确认的事项

  1. 确认您的电脑能够运行 JavaScript。不需要管理员权限。

  2. 打开浏览器的开发者工具,准备在 Console 中查看是否有错误,在 Network 中查看是否有 CDN 获取失败的情况。

  3. 如果演示未实际发布,请将 Daily Code 侧的index.html和app.js保存到同一个文件夹中,并通过本地 HTTP 服务器打开。当使用 module 时,不保证直接通过 file:// 运行的行为。

  4. 对比操作前后的结果。如果与期望值不同,请先记录“什么没有显示出来”。

运作机制全景图

flowchart LR
    A["入力やクリック"] --> B["イベントを受ける"]
    B --> C["D3.js のAPI"]
    C --> D["状態と描画を更新"]
    D --> E["見た目と文字で確認"]

此图为学习用的概念图,并未表示浏览器内部实现或网络通信的细节。无论是什么库,“追踪操作传达给了哪个变量”这一点都是相通的。

无法使用公开演示时的本地确认方法

将固定提交中的HTML 主体和JavaScript 主体通过 GitHub 的 Raw 视图分别index.html与app.js一起保存在同一个新文件夹中。仅靠 README 无法运行。在 Windows 上,在该文件夹中打开 PowerShell,py -3 -m http.server 8000 --bind 127.0.0.1而在 Linux/macOS 上,运行python3 -m http.server 8000 --bind 127.0.0.1,然后在同一台电脑上打开http://127.0.0.1:8000/。若要退出,请在终端中输入Ctrl+C。由于浏览器会从外部 CDN 获取库本身,如果无法连接,请检查控制台(Console)和网络(Network)错误。此步骤为复现指南,并非本文的浏览器实际测量报告。

它是如何运作的:解读 API

D3 的 select 以 DOM 元素为目标,data 将各个元素与数据关联起来。当显示对象的数量发生变化时,join 可以统一处理创建、更新和删除元素的方法。SVG 是可以嵌入 HTML 中的矢量格式,因此它可以分别拥有圆圈和文本作为元素。这里圆的半径不是直接乘以投票数,而是通过 scaleSqrt 转换为平方根比例尺。因为圆的面积与半径的平方成正比,如果让半径与数值成正比,就会夸大数量上的差异。

如何阅读最小代码

const scale = d3.scaleSqrt().domain([0, 30]).range([0, 75]);
svg.selectAll("circle").data(votes, d => d.name).join("circle")
  .attr("r", d => scale(d.count));

以上是提取了 API 要点的代码片段。它不是可复制并独立运行的完整文件。运行所需的 HTML 和整套实现请在 Daily Code 侧的 README / 演示文件中确认。追踪哪个函数选择 HTML 元素、哪一行更新数值,并使用已知的虚拟值进行测试。

仅修改一个条件进行比较

即使为每种动物更改了颜色,也不要仅凭颜色判断,而是要显示名称。如果要向 SVG 添加条形图,可以使用相同的 data 数组创建多种显示格式。将 transition 的时长设为 0 会立即更新,但数值本身的大小并没有改变。为了在改变呈现方式时不必连带修改数据处理,应当将数值更新函数与绘图函数分离。

比较的步骤是:记录初始值,只更改一处,然后确认结果是否出现在预期的部分中。如果一次更改多个输入,就会分不清是什么产生了影响。请连同恢复到修改前状态的操作一起进行验证。

失败时应该检查哪里

如果圆圈数量太多,标签会重叠而无法阅读。此外,即使适当调整了圆圈的面积,仅凭分散的圆圈有时也很难准确比较排名。如果顺序很重要,条形图可能更合适。此外,必须假定更新会在 transition 过程中多次发生,并在此前提下检查绘图的一致性。由于此演示不会保存投票,重新加载会恢复为初始值。

观察到的状态排查的要点应对示例
画面从初始状态起没有变化脚本获取、初始化、事件注册检查 Console / Network / script 标签
显示发生了变化,但含义不对输入值、数组、单位、更新目标固定数值,逐个条件进行检查
无法点击按钮选择器与 DOM 生成顺序检查 HTML,确认 id 是否一致
仅在部分终端上无法运行浏览器功能、权限、CDN、性能记录终端及版本、复现操作

浏览器内的错误与公开 Web 服务器的故障是不同的。前者通过开发者工具中的错误内容进行排查,后者通过 HTTP 响应或静态资源分发条件进行排查。不把未知的失败描述为成功,能够提升技术笔记的可靠性。

在业务与学习中的应用

可用于问卷调查结果、分类结构、教育教材、展览品等场景。在实际选举或官方统计等用途中,必须另外实现显示前的票数统计、审计、签名以及防篡改功能。D3 是一个展示类库,并不保证投票的公正性。

引入前需要决定的事项

向读者公开时,需确定显示的数据从何而来、谁可以修改、屏幕上留存的信息种类,以及类库更新时的确认项目。本次演示中既没有登录也没有服务器保存。因此,在添加运维功能之前,建议首先区分“按预期显示的最小部分”以及“需要实际业务中的可靠性、权限和备份的部分”。第三方 CDN 涉及外部通信,因此需要提前确认企业网络是否允许使用。

与其他方式进行比较

方式适用场景注意事项
D3.js符合使用目的的场景,例如每次为动物投票时更改圆圈大小和票数需要更新依赖库并管理使用条件
浏览器标准 API自行编写小型功能自行确认规范与兼容性
静态图像、表格无需操作的说明无法现场体验状态的变化

库是按需选择的工具。请结合您想要达成的目标与学习成本来进行对比。对于小规模页面,不以“引入库”为目的会更容易维护。

GitHub 示例

博客正文用于阐述背景与理念,Daily Code 则作为运行与改造的代码,两者分工明确。其中不包含用于向外部服务发送或保存数据的 API。

官方信息与第一手资料

资料确认范围:截至2026-10-27编辑时,请参考官方文档。这并不保证链接未来的更改或所有的CDN资产响应。

验证范围补充

我们将存储在GitHub上的固定源码与官方API说明进行了核对。浏览器操作、CDN加载以及在各个操作系统上的结果尚未经过验证。在进行实际运行确认时,请检查控制台(Console)和网络(Network),切勿仅凭画面的SUCCESS显示就断定所有条件都已成功。

文档信息

文章??
使用 D3.js 可视化动物人气投票:体验 SVG 与平方根比例尺
?布日期
更新日期
来源
https://papanda925.com/?p=18299&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制