gpt4 book ai didi

javascript - 为力导向图创建下限(例如力导向直方图)

转载 作者:行者123 更新时间:2023-11-30 20:15:41 24 4
gpt4 key购买 nike

我想创建我认为最好描述为力导向直方图(或点/气泡直方图)或 y 值沿 x 轴受限的蜂群。

也就是说,使用力导向布局,根据某些 x 值分配 x 位置,并根据该值的计数分配 y 位置,其中 y 值必须保持在某个下限之上。

我创建了一个 force-directed beeswarm plot这就是几乎我想要的。我只是还没有弄清楚 y 轴约束。

感谢您的帮助/建议!

最佳答案

要应用这样的约束,您可以直接限制 d.y 值——只需替换

.attr('cy', d => d.y)

例如,

.attr('cy', d => d.y = Math.min(d.y, height / 2))

这样节点被强制高于height/2。重要的是不仅要约束 cy,还要更新 d.y,以便在下一次迭代中考虑这个新位置。如果您不喜欢在 return 语句中赋值,可以使用 each 运算符单独修改 d.y

forceCenter 这里会把事情搞砸,我不确定是否有必要。我也怀疑 manyBody 力的必要性 — 为什么圆圈必须相互吸引(您使用正强度 = 吸引力)?最好用轴吸引它们 (forceY)。

在圆的准确 x 位置、x 轴的吸引力和收敛速度(迭代)之间存在折衷。可能需要对力的强度进行一些调整。 d3-force 自述文件中描述了强度的影响:https://github.com/d3/d3-force#x_strength .对于大多数力,建议使用 [0, 1] 范围内的强度。

const width = 500
const height = 150
const svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)

const colorScale = d3.scaleOrdinal()
.range(['#FCFCFC', '#F7567C', '#FFFAE3', '#99E1D9', '#5D576B'])

const radius = 7
const sampleData = d3.range(150).map(() => ({r: radius,
value: width/2 + d3.randomNormal(0,75)()}))

// set params for force layout
//const manyBody = d3.forceManyBody().strength(2)
//const center = d3.forceCenter().x((width/2)).y((height/2))

// define force
let force = d3.forceSimulation()
//.force('charge', manyBody)
//.force('center', center)
.force('collision', d3.forceCollide(d => d.r).strength(1))
.velocityDecay(.48)
.force('x', d3.forceX(d => d.value).strength(3))
.force('y', d3.forceY(height - radius).strength(0.2))
.nodes(sampleData)
.on('tick', changeNetwork)

svg.selectAll('circle')
.data(sampleData)
.enter()
.append('circle')
.style('fill', (d,i) => colorScale(i))
.attr('r', d => d.r)
.attr('stroke', 'black')
.attr('stroke-width', .1)

function changeNetwork() {
d3.selectAll('circle')
.attr('cx', d => d.x)
.attr('cy', d => d.y = Math.min(d.y, height - radius - 1))
}
<head>
<meta charset="utf-8">
<script src="https://d3js.org/d3.v4.min.js"></script>
</head>

关于javascript - 为力导向图创建下限(例如力导向直方图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936114/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com