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

标签 javascript d3.js data-visualization

我想创建我认为最好描述为力导向直方图(或点/气泡直方图)或 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/

相关文章:

javascript - Jquery clone div inside form

javascript - 隐藏/显示多个按钮,除非相关字段已完成

javascript - AngularJS ng-select 和 ng-switch-when 问题

javascript - 鼠标悬停工具提示不会固定在右上角

maps - 如何可视化 map 内置数据 block 中的数据(点)?

javascript - 如何在组件内添加计数动画?

javascript - 更新 ID 和 jQuery 事件处理程序时出现问题

jQuery:不同 parent 之间的事件委托(delegate)

graphics - 什么技术更适合信息图表和数据可视化项目?

java - 将 Processing 草图保存到 PNG 文件,服务器端没有 GUI/显示