Поскольку d3
поставляется с модулями ES.Таким образом, вы можете импортировать как хотите.
import { select, scaleOrdinal } from 'd3'
// or
import * as d3 from 'd3'
Тогда вы можете использовать d3
как обычно.
Пример:
index.html
<foo-bar></foo-bar>
<script type='module' src='app.js'></script>
app.js
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js'
import * as d3 from 'd3'
class FooBar extends PolymerElement {
static get template () {
return html`
<style>
.links line {
stroke: #999;
stroke-opacity: 0.6;
}
.nodes circle {
stroke: #fff;
stroke-width: 1.5px;
}
</style>
<svg width='960' height='600'></svg>
`
}
ready () {
super.ready()
this.initGraph()
}
initGraph () {
let svg = d3.select(this.shadowRoot.querySelector('svg'))
let width = +svg.attr('width')
let height = +svg.attr('height')
let color = d3.scaleOrdinal(d3.schemeCategory10)
let simulation = d3.forceSimulation()
.force('link', d3.forceLink().id(d => d.id))
.force('charge', d3.forceManyBody())
.force('center', d3.forceCenter(width / 2, height / 2))
d3.json('miserables.json').then(graph => {
let link = svg.append('g')
.attr('class', 'links')
.selectAll('line')
.data(graph.links)
.enter().append('line')
.attr('stroke-width', d => Math.sqrt(d.value))
let node = svg.append('g')
.attr('class', 'nodes')
.selectAll('circle')
.data(graph.nodes)
.enter().append('circle')
.attr('r', 5)
.attr('fill', d => color(d.group))
.call(d3.drag()
.on('start', dragstarted)
.on('drag', dragged)
.on('end', dragended))
node.append('title').text(d => d.id)
simulation.nodes(graph.nodes)
.on('tick', () => {
link
.attr('x1', d => d.source.x)
.attr('y1', d => d.source.y)
.attr('x2', d => d.target.x)
.attr('y2', d => d.target.y)
node
.attr('cx', d => d.x)
.attr('cy', d => d.y)
})
simulation.force('link').links(graph.links)
})
function dragstarted (d) {
if (!d3.event.active) simulation.alphaTarget(0.3).restart()
d.fx = d.x
d.fy = d.y
}
function dragged (d) {
d.fx = d3.event.x
d.fy = d3.event.y
}
function dragended (d) {
if (!d3.event.active) simulation.alphaTarget(0)
d.fx = null
d.fy = null
}
}
}
customElements.define('foo-bar', FooBar)
Примечание. Полимер использует Shadow DOM, через который не может пройти обычный селектор (например, d3.select
).
В этом примере Iизменить с график направленной силы .