D3.js - 如何迭代数据集中的子数组

2024-04-27

我试图让 d3 迭代数据中的子数组并生成多个饼图。

这是完整的代码(来自https://gist.github.com/mbostock/1305111 https://gist.github.com/mbostock/1305111 and https://gist.github.com/enjalot/1203641 https://gist.github.com/enjalot/1203641):

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>D3 Page Test</title>
        <script type="text/javascript" src="http://mbostock.github.com/d3/d3.js"></script>
 <style type="text/css">

body {
  text-align: center;
}

    </style>
  </head>
  <body>
    <script type="text/javascript">

// Define the data as a two-dimensional array of numbers. If you had other
// data to associate with each number, replace each number with an object, e.g.,
// `{key: "value"}`.
var datad = [
  {s:[ 20,  1, 1], l:[10,100]},
  {s:[ 1, 20, 1], l:[ 20, 200]},
  {s:[ 1, 1, 20], l:[ 30,300 ]}
];

// Define the margin, radius, and color scale. The color scale will be
// assigned by index, but if you define your data using objects, you could pass
// in a named field from the data object instead, such as `d.name`. Colors
// are assigned lazily, so if you want deterministic behavior, define a domain
// for the color scale.
var m = 10,
    r = 100,
    z = d3.scale.category20c();

// Insert an svg:svg element (with margin) for each row in our dataset. A
// child svg:g element translates the origin to the pie center.
var svg = d3.select("body").selectAll("svg")
    .data([datad])
  .enter().append("svg:svg")
    .attr("width", (r + m) * 2)
    .attr("height", (r + m) * 2)
  .append("svg:g")
    .attr("transform", "translate(" + (r + m) + "," + (r + m) + ")");

 var pie = d3.layout.pie()           //this will create arc data for us given a list of values
        .value(function(d, i) { return d.s[i]; });    //we must tell it out to access the value of each element in our data array


// The data for each svg:svg element is a row of numbers (an array). We pass
// that to d3.layout.pie to compute the angles for each arc. These start and end
// angles are passed to d3.svg.arc to draw arcs! Note that the arc radius is
// specified on the arc, not the layout.
svg.selectAll("path")
    .data(pie)
  .enter().append("svg:path")
    .attr("d", d3.svg.arc()
    .innerRadius(0)
    .outerRadius(r + 2))
    .style("fill", function(d, i) { return z(i); });

    </script>
  </body>
</html>

我得到一个饼图,它由数据集中每个“s”数组中的“20”值组成。

第一个饼图是从 data[0][0] 中绘制的,第二个饼图是从 dated[1][1] 中绘制的,第三个饼图是从 datad[2][2] 中绘制的。

我期待三个饼图(数据中的每个“s”数组一个)。

我认为我的问题在于:

     var pie = d3.layout.pie()  //this will create arc data for us given a list of values
        .value(function(d, i) { return d.s[i]; });  //we must tell it out to access the value of each element in our data array

我如何告诉它迭代每个 s 数组,而不是同时迭代 datad 和 s 数组。也就是说,我想迭代 datad[0]s[0], datad[0]s[1], datad[0]s[2] ... datad[2]s[0], datad[2]s [1](等)而不是 datad[0]s[0]、datad[1]s[1]、datad[2]s[2]

提示或指示表示赞赏!

编辑:这是小提琴:jsfiddle.net/H2SKt/701/


这里出现了一些问题,所有这些问题加在一起就得到了一个漂亮的饼图,但它不是您想要绘制的图表。

对于初学者来说,当您将数据连接到 svg 选择时:

var svg = d3.select("body").selectAll("svg")
    .data([datad])

您将数据数组嵌套在一个新数组(方括号)中,其中数据数组是唯一元素。所以你只能得到一个<svg>从你的enter()声明,不是三个。将其更改为

var svg = d3.select("body").selectAll("svg")
    .data(datad)

你得到三个<svg>元素,如您所愿。但它们都没有饼图,因为您的饼图函数无法找到您告诉它要查找的数据值:

 var pie = d3.layout.pie()    
        .value(function(d, i) { return d.s[i]; });   

svg.selectAll("path")
    .data(pie)
  .enter().append("svg:path")

饼图函数期望传递一个array的数据,它会调用指定的value功能on each数组的元素。你告诉它数组的每个元素都有一个s属性是一个数组,它应该访问该数组中的元素。当您的饼函数传递整个原始数据数组时,这(在某种程度上)是有效的,但现在我们已经将原始数据数组分割成不同的 SVG 元素了。现在,pie 函数正在传递以下形式的数据对象{s:[ 1, 1, 20], l:[ 30,300 ]},并且不知道该怎么办。

因此,您需要更改两件事:您需要确保 pie 函数仅传递它应该使用的值数组,并且您需要告诉它如何访问该数组的每个元素中的值。除非您实际上不必执行第二部分,因为这些值只是原始数字并且默认值函数将起作用:

 var pie = d3.layout.pie() 
       // .value(function(d, i) { return d; });  //default, not required

svg.selectAll("path")
      .data( function(d) { return pie(d.s); })
  .enter().append("svg:path")

The d数据连接函数中的值是附加到每个的数据对象<svg>元素;匿名函数提取子数组并对其调用pie函数,以返回每个子数组的数据数组<path>该 SVG 中的元素。

工作小提琴:http://jsfiddle.net/H2SKt/706/ http://jsfiddle.net/H2SKt/706/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3.js - 如何迭代数据集中的子数组 的相关文章

  • 如何在“object”标签内选择 SVG?

    HTML 页面的内容如下所示 方法如下script js looks var tooltip d3 select body append div style position absolute sty
  • 使用 d3-geo-projection 命令行工具设置自定义投影

    我正在尝试使用 geoproject 在 geojson 文件上设置投影 具体来说 我正在尝试将投影设置为 BCalbers http spatialreference org ref epsg 3005 http spatialrefer
  • D3更新circle-pack数据新节点与现有节点重叠

    我正在关注一般更新模式 http bl ocks org mbostock 3808234但在分层方面存在问题 使用圆形包装布局 我pack新数据 update enter and exit圆形元素 然而 当新元素enter 它们重叠upd
  • d3 v4 使用 TypeScript 进行拖放

    我正在使用 D3 库 v4 和 Angular2 我想拖放 svg 元素 我有一个代码 item call d3 drag on start dragStarted on drag dragged on end dragEnded and
  • 如何从此 d3.js layout.tree 获取树祖先和树后代的列表?

    我正在尝试和修改this https bl ocks org mbostock 4339083d3 js 的示例 用于根据 JSON 树结构绘制树 这就是树的一部分开始时的样子 我正在尝试进行两个单独的修改 但我不知道该怎么做 当单击节点的
  • 如何使用 d3.format 获取可本地化或可定制的 si 代码

    使用 SI 代码绘制图表正是我们想要的 我们的 y 轴值往往是较大的货币值 例如 10 411 504 201 20 缩写这个 至少在美国语言环境中 这应该转换为 10 4B 但是使用 d3 format 的 s 类型表示 SI 代码 这将
  • Javascript 将对象推送为克隆

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • 在 d3.js 中换行长文本

    我想将长文本元素换行为宽度 这里的例子取自博斯托克的wrap功能 http bl ocks org mbostock 7555321 但似乎有两个问题 首先 wrap的结果没有继承元素的x值 文本左移 其次它绕在同一条线上 并且lineHe
  • 表格中与文本一起内嵌 D3 迷你图

    假设有一个这样的表 var data Orange Orange 6 3 3 2 5 Apple Red 6 2 6 5 5 Grape Purple 9 1 2 3 1 我希望将字符串表示为字符串 但将数字数组表示为 D3 折线图 如果这
  • 如何从 mysql 数据库中提取数据并使用 D3.JS 进行可视化?

    我有一个数据库MySQL我想在其中可视化D3 JS 为了做到这一点 首先我想parse中的数据JSON格式 然后编写一个基本代码 从数据库中提取数据并使用D3 JS 我环顾四周 但找不到我想要的东西 因为我是新手D3 JS 我怎样才能做到这
  • 调整发散堆积条形图以使用通用更新模式

    我一直在使用可用的堆积条形图示例here https bl ocks org mbostock b5935342c6d21928111928401e2c8608使用以下代码 var data month Q1 2016 apples 384
  • JS / d3.js:突出显示相邻链接的步骤

    再会 我之前对该项目的问题是 D3 js 根据相同的 json 值动态生成源和目标 https stackoverflow com questions 41138515 d3 js dynamically generate source a
  • 时间序列折线图与轴不同步

    本实验基于这个d3官方例子 http bost ocks org mike path 我想要实现的是可视化时间序列数据的最后 x 分钟 我有这个代码的副本jsfiddle http jsfiddle net 225dC 3 单击以添加新数据
  • 如何让d3.js生成svg而不绘制它?

    有没有办法只生成 svg 并将其作为字符串获取 而不实际绘制它 我考虑过将 svg 渲染到隐藏的 div 然后读取内部 html 但是有没有更干净的方法 我认为你可以这样做 var svg d3 select body append svg
  • D3.js折线图溢出边距

    我有 d3 js 折线图 它作为 angular js 应用程序的指令包含在内 动态添加的线和 xAxis 以及缩放线上的边距溢出 我必须在图的顶部为每条加载的线创建 Ox 轴 并具有 Ox 和 Oy 单独的缩放可能性 Oy 缩放工作正常
  • 使用 Meteor 中的 D3 访问 csv 文件

    我已经使用 D3 成功渲染了一个 HTML 表格 显示了 csv 文件中的数据 但是当我将相同的代码移入 Meteor 项目时 我遇到了问题 传递到 d3 csv 回调中的数据对象一次拾取 HTML 文件 1 行 而不是 csv 数据 仅当
  • 如何使用 dc.js 或 d3.js 为行图添加轴标签

    对于条形图和堆积图 我们可以使用 xAxisLabel X Axis Label and yAxisLabel Y Axis Label 为各个轴添加标签的函数 但 有没有办法为行图添加轴标签 尝试这样的事情 dc renderAll fu
  • D3、TS 和 Angular 2

    我正在尝试将 D3 v4 与 Angular 2 Typescript 一起使用 我目前正在研究 D3 v4 我能够遵循 stackoverflow 中类似问题的一些答案 但没有成功 我已经导入了大部分 D3 库及其类型 我使用的是 TS
  • 节点大小与 D3 中的子节点数量成正比

    我创建了这个点击 展开 折叠网络 http jsfiddle net 5Lv8gkqv http jsfiddle net 5Lv8gkqv var width 960 height 500 root name Chocolate tag
  • 如何将所有后代节点和链接设置为与 2 级祖先相同的颜色?

    我有一个 d3 js 树 其后代节点接收其 2 级祖先的节点颜色 这在级别 2 到级别 3 之间有效 但在级别 4 及以上级别停止工作 相关代码 var colourScale d3 scale ordinal domain MD Prof

随机推荐

  • C 结构体的 Python ctypes 定义

    我正在尝试调用 Matlab 编码器生成的一些 C 代码 Matlab 使用名为 emxArray 的 C 结构体来表示矩阵 记录如下 http www mathworks co uk help fixedpoint ug c code i
  • 如何使用 codeigniter 生成 5 位字母数字唯一 ID?

    我有一个项目 需要为用户生成唯一的 5 位数字母数字 ID 我怎样才能使用 codeigniter 实现这一点 thanks 字符串助手中有一个名为 random string 的函数 this gt load gt helper stri
  • urllib2.urlopen 在 Django 中失败

    I use urllib2 urlopen url 获取 HTML 内容 网址是http 127 0 0 1 8000 m html 该方法成功获取HTML内容 但在 Django 中 如果我尝试获取 HTML 内容 它会在函数中停止 ur
  • 检查 python 中的 type == list 是否[重复]

    这个问题在这里已经有答案了 我无法弄清楚我的代码有什么问题 for key in tmpDict print type tmpDict key time sleep 1 if type tmpDict key list print this
  • 为什么链接器要修改--defsym“绝对地址”

    目标 一个使用可执行文件中的函数 不导出符号 的共享库 Means gcc Wl defsym function 0x432238 手册页指出 defsym symbol expression Create a global symbol
  • 无法在 root 设备上运行程序“su”

    我有一部运行 Android N AOSP 版本 的 root 手机 我试图从我的应用程序获取 root 权限 但它不断被拒绝 这是我正在尝试的 java lang Process p runtime exec su DataOutputS
  • Python - 在 Windows 中的多进程下创建线程时出现“can't pickle thread.lock”错误

    我陷入了我认为的基本多进程和线程问题 我已经设置了一个多进程 其中有一个线程 但是 当我在其中设置线程类时init函数 我收到以下错误 类型错误 无法pickle thread lock对象 但是 如果线程是在线程之外设置的 则不会发生这种
  • 更改 jQuery UI 滑块大小

    我在用这个 UI 滑块 http api jqueryui com slider entry examples尺寸也是我网站上的尺寸 不是宽度 而是按钮的尺寸 演示页面底部 但是here http jqueryui com themerol
  • 如何通过 XAML 绑定设置当前 CultureUI

    我有一个绑定到字符串的 TextBlock 我希望该字符串以应用程序的当前 UI 区域性显示 我想在 XAML 中执行此操作 文本块很简单 如下所示
  • 如何从 type=file 输入中删除“未选择文件”?

    我似乎无法找到任何方法来删除显示在 文件 类型的输入旁边的 未选择文件 文本 你们知道如何删除此文本吗 input type file color transparent Enjoy
  • 如何将tmux热键设置为Ctrl-,即Ctrl+逗号

    我在 Mac OS X 上设置首选 tmux 热键时遇到了一些麻烦 The most common hotkeys that invokes tmux s magics are CTRL A and CTRL B But I would r
  • Internet Explorer 8 不会修改打印样式表中的 HTML5 标记

    我之前正在制作打印样式表 并遇到了 IE8 的问题 我正在使用 HTML5 和几个布局标签 包括页眉 导航和页脚 由于某种原因 在我的打印样式表中显示 无 这些标签上的声明在 IE8 中被忽略 我只能假设后续的较低版本 我首先认为 IE9
  • Javascript 弹出窗口会消失

    我需要有一个类似消息框的东西 但没有按钮 它会显示在屏幕上All data was saved然后在 2 3 秒内消失 这就像一个警报 我们提醒用户记录已保存 但我需要它显示在屏幕顶部的一个小框中 并且它应该淡出 有人可以帮我编写一个可以执
  • 将一些提交移至另一个分支

    我只有一个分支有 git repo A B C D E master 我想将提交 B C 和 D 拆分到另一个名为开发的分支 A E master B C D develop 做到这一点最简单的方法是什么 无需关心远程仓库 做cherry
  • `/dev/urandom` 适合模拟目的吗?

    似乎在类 Unix 系统中使用纯 C fread from dev urandom是提取高质量随机字节的最简单方法 我需要运行一个每秒需要大约 10k 32 位随机数的模拟 并且可能会运行几天 是 dev urandom可以用于此目的吗 当
  • 根据具有重复测量的其他列的条件向列添加值

    我对 R 还很陌生 正在尝试在 Rstudio 中准备我的数据集以供进一步分析 如果有人能帮助我找到代码的解决方案 我将不胜感激 我的数据叫做m8 这就是我到目前为止所做的 但它只返回整个 Q2 列中 U1High U1Low 和 U1Me
  • 如何对加密算法进行逆向工程?

    我编写了一个以这种方式加密文本的应用程序 获取输入文本 反转文本 转换为十六进制 用密钥进行异或 Base64编码 现在 我自己没有做很多加密 编码 所以我的问题可能听起来很愚蠢 但是 假设我得到一个包含上述算法内容的文件 而我不知道这个算
  • 如何修改 HttpUrlConnection 的标头

    我试图稍微改进一下 Java Html 文档 但我遇到了问题HttpUrlConntion 有一件事是 如果用户代理是 Java VM 某些服务器会阻止请求 另一个问题是HttpUrlConnection不设置Referrer or Loc
  • 将数字缩放为 <= 255?

    我的单元格的数值可以是 0 到 0 之间的任何值Integer MAX VALUE 我想对这些单元格进行相应的颜色编码 如果该值 0 则 r 0 如果该值是Integer MAX VALUE 则 r 255 但是中间的值呢 我想我需要一个函
  • D3.js - 如何迭代数据集中的子数组

    我试图让 d3 迭代数据中的子数组并生成多个饼图 这是完整的代码 来自https gist github com mbostock 1305111 https gist github com mbostock 1305111 and htt