- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想知道如何修改 Mike Bostock's example of a multi-force layout为了尝试获得力布局以对网格中的节点进行分组。
让我们想象一下我们有以下 csv:
Name, Category1, Category2
1,1,1
2,1,2
3,1,1
4,2,2
5,3,1
6,1,4
7,5,5
8,1,5
9,2,4
10,3,3
11,4,4
12,4,5
13,3,4
14,1,2
15,1,1
16,2,2
17,3,1
18,2,1
19,4,5
20,3,1
对于他的数据类型,我希望将类别 1 的所有可能值作为列,将类别 2 的所有可能值作为行,并希望我的节点根据它们的值自动分组到“适当的”单元格中对于类别 1 和类别 2。
我刚刚开始使用 D3,真的不知道从哪里开始。我指出的示例很有用,但很难知道要修改什么,因为代码几乎没有注释。
如有任何帮助,我们将不胜感激。
最佳答案
忘了那个例子:它使用 D3 v3,这使得定位节点的方式更加复杂。
在 D3 v4/v5 中有两个方便的方法,forceX和 forceY .
您需要做的就是创建您的比例尺,例如使用点比例尺(我认为这是最好的选择):
var columnScale = d3.scalePoint()
.domain(["1", "2", "3", "4", "5"])
.range([min, max]);
var rowScale = d3.scalePoint()
.domain(["1", "2", "3", "4", "5"])
.range([min, max]);
然后在模拟中使用这些尺度:
var simulation = d3.forceSimulation(data)
.force("x", d3.forceX(function(d) {
return columnScale(d.Category1)
}))
.force("y", d3.forceY(function(d) {
return rowScale(d.Category2)
}))
这是一个包含您共享的数据的基本演示(我使用色标来突出显示网格上的不同位置):
var csv = `Name,Category1,Category2
1,1,1
2,1,2
3,1,1
4,2,2
5,3,1
6,1,4
7,5,5
8,1,5
9,2,4
10,3,3
11,4,4
12,4,5
13,3,4
14,1,2
15,1,1
16,2,2
17,3,1
18,2,1
19,4,5
20,3,1`;
var data = d3.csvParse(csv);
var w = 250,
h = 250;
var svg = d3.select("body")
.append("svg")
.attr("width", w)
.attr("height", h);
var color = d3.scaleOrdinal(d3.schemeCategory10);
var columnScale = d3.scalePoint()
.domain(dataRange(data, 'Category1')) // or ["1", "2", "3", "4", "5"]
.range([30, w - 10])
.padding(0.5);
var rowScale = d3.scalePoint()
.domain(dataRange(data, 'Category2')) // or ["1", "2", "3", "4", "5"]
.range([30, h - 10])
.padding(0.5);
var simulation = d3.forceSimulation(data)
.force("x", d3.forceX(function(d) {
return columnScale(d.Category1)
}))
.force("y", d3.forceY(function(d) {
return rowScale(d.Category2)
}))
.force("collide", d3.forceCollide(6))
var nodes = svg.selectAll(null)
.data(data)
.enter()
.append("circle")
.attr("r", 5)
.attr("fill", function(d) {
return color(d.Category1 + d.Category2)
});
var xAxis = d3.axisTop(columnScale)(svg.append("g").attr("transform", "translate(0,30)"));
var yAxis = d3.axisLeft(rowScale)(svg.append("g").attr("transform", "translate(30,0)"));
simulation.on("tick", function() {
nodes.attr("cx", function(d) {
return d.x
})
.attr("cy", function(d) {
return d.y
})
});
function dataRange(records, field) {
var min = d3.min(records.map(record => parseInt(record[field], 10)));
var max = d3.max(records.map(record => parseInt(record[field], 10)));
return d3.range(min, max + 1);
};
svg {
background-color: floralwhite;
border: 1px solid gray;
}
<script src="https://d3js.org/d3.v5.min.js"></script>
PS:在两种尺度中,我都在域中使用字符串,因为 d3.csv
会将您的数据加载为字符串,而不是数字。根据您的需要进行更改。
关于javascript - D3 网格中的力模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50253247/
我正在尝试编写一个程序,以表格的形式计算我的结果。我有一个液压升降机,可以显示作用在直径 (D1) 的活塞上的小力(我称之为 F1)可以乘以作用在直径 (D2) 的活塞上的大力 (F2) ,电梯的运行
我有一个 fiddle :https://jsfiddle.net/mvLf579a/284/ 此 fiddle 允许您使用 D3 径向布局来布置力网络,并将布局重置为默认力布局。但是,重置时链接强度
我想实现表格 View 单元格重叠,因为我想实现这种效果: 所以基本上细胞会一个接一个地堆叠。我的目标是 iOS7+(目前正在测试 iOS8)。 我目前正在做一个 CAGradientLayer,它被
尽管在 box2d 前花了几个小时,但我仍然不明白 applyforce 和 applyimpulse 是如何工作的。我尝试使用一些视觉效果来更好地理解正在发生的事情(通过在 body 位置和应用点之
首先,我是 D3 的新手。我正在尝试使用这些示例在单个 D3 图中实现不同的行为: Drag + Zoom 力导向图 但我的图表在几秒钟后卡住,我不明白为什么... 这是我的代码:http://jsf
所以,我在 Xcode 上用 Swift 玩了这个游戏,我有一个跳跃的 SKShapeNode。不过,我希望这种跳跃与玩家的触感相称。因此,小水龙头会跳得小,而轻快的水龙头会跳得更高。怎么可能做到这一
在 ARKit/SceneKit 中,当用户点击按钮时,我想对我的节点施加一个脉冲。我希望冲动来自当前用户的角度。这意味着节点将远离用户的视角。多亏了这段代码,我能够获得当前的方向/方向: func
我正在使用 Angular2 并拥有父子组件。我的子组件正在使用 DatePipe 提供程序,因为父单元测试失败并给出以下错误, 错误:非法状态:无法加载管道 DatePipe 的摘要。 如何解决这个
我是一名优秀的程序员,十分优秀!