- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图让 d3 遍历我的数据中的子数组并生成多个饼图。
这是完整的代码(来自 https://gist.github.com/mbostock/1305111 和 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”值组成。
第一个饼片取自datad[0][0],第二个饼片取自datad[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] (etc) 而不是 datad[0]s[0], datad[1]s[1], datad[2]s[2]
感谢提示或指点!
编辑:这是 fiddle :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")
饼图函数需要传递一个数组数据,它会调用指定的value
。 在数组的每个元素上运行。你告诉它数组的每个元素都有一个 s
属性是一个数组,它应该访问该数组中的一个元素。当你的 pie 函数被传递给你的整个原始数据数组时,这是可行的(某种程度上),但现在我们已经将原始数据数组拆分为不同的 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")
d
数据连接函数中的值是附加到每个 <svg>
的数据对象元素;匿名函数提取子数组并在其上调用 pie 函数,以返回每个 <path>
的数据数组该 SVG 中的元素。
工作 fiddle : http://jsfiddle.net/H2SKt/706/
关于D3.js - 如何遍历数据集中的子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21733536/
我有这个 html 代码: HELLO WORLD! X V HELLO WORLD! X V 我想按 X(类关闭)将父 div 的高度更改为 20px 并显示 V(类打开),但在每个 d
在会计应用程序的许多不同实现中,有两种主要的数据库设计方法来保存日志和分类帐数据。 只保留 Journal 信息,然后 Ledger 只是 Journal 的一个 View (因为 journal 总
我想在另一个子里面有一个子, sub a { sub b { } } 我想为每次调用 sub b 创建一个新的 sub a 实例。有没有办法在 Perl 中做到这一点? 当我运行上面的
我有一些代码正在查找重复项并突出显示单元格: Private Sub cmdDups_Click() Dim Rng As Range Dim cel As Range Set Rng = ThisW
可能有一个简单的解决方案,但我很难过。 我有一个包含一个 ID 字段的主表。在两个可能的字段中有一个具有该 ID 的子表。想象一个由选手 A 和选手 B 组成的 double 队。Master 表将有
假设我有一个包含对象的数组: [ { "id": "5a97e047f826a0111b754beb", "name": "Hogwarts", "parentId": "
我正在尝试对 MySQL 数据库表执行一对父/子模型的批量插入,但似乎无法使用标准的 ActiveRecord 功能来完成。所以,我尝试了 activerecord-import gem,但它也不支持
我有一个带有多个子类的父抽象类。最终,我希望通过 GUI 中的进度条显示子类中完成的进度。 我目前所做的,我意识到这是行不通的,是在父类中声明为每个子类将覆盖的虚拟方法的事件方法定义。所以像: pub
是否可以通过键数组在对象中设置变量?例如我有这个对象: var obj = {'outer': {'inner': 'value'} }; 并希望设置由键数组选择的值: var keys = ['ou
我有一个名为 companies 的 MySQL 表,如下所示: +---------+-----------+-----------+ | id_comp | comp_name | id_pare
我正在尝试使用 sublime text 在 sublime text 上的 ionic 上打开我的第一个应用程序。它给了我一个“找不到命令”的错误。如何修复? 我试过这些命令: sudo rm -r
不好意思问,但我正在使用 webapp2,我正在设计一个解决方案,以便更容易定义路由 based on this google webapp2 route function .但这完全取决于能够在子级
我有代表树的数字字符串(我不知道是否有官方名称): 012323301212 上面的例子代表了 2 棵树。根用 0 表示。根的直接子代为“1”,“1”的直接子代为“2”,依此类推。我需要将它们分组到由
是否可以在当前 Activity 之上添加 Activity 。例如,假设我单击一个按钮,然后它将第二个 Activity 添加到当前 Activity 。而第二个 Activity 只覆盖了我当前
我很难思考如何为子资源建模。 以作者的书籍为例。你可以有 N 本书,每本书只有一位作者。 /books GET /books POST /books/id PUT /books/id DELETE 到
有人可以向我解释以下内容(python 2.7) 来自已解析文件的两个字符串数字: '410.9''410.9 '(注意尾随空格) A_LIST = ['410.9 '] '410.9' in '41
背景 在 PowerShell 中构建 hash table 是很常见的通过特定属性快速访问对象,例如以 LastName 为基础建立索引: $List = ConvertFrom-Csv @' I
我真的很难弄清楚如何调用嵌套 Polymer Web 组件的函数。 这是标记: rise-distribution组件有 canPlay我想从 rise-playlist
我写了一个小工具转储(以 dot 格式)一个项目的依赖关系图,其中所有位于同一目录中的文件都聚集在一个集群中。当我尝试生成包含相应图形的 pdf 时,dot开始哭: 命令 dot -Tpdf trim
给定一个 CODE ref,是否可以: 访问该 CODE ref 的解析树 通过指定 CODE ref 的解析树来创建一个新的 CODE ref,该解析树可以包含在 1 中返回的解析树的元素 通常我们
我是一名优秀的程序员,十分优秀!