Установка цвета узлов в d3 - PullRequest
0 голосов
/ 02 мая 2018

Я играю с примером D3 Принудительное перетаскивание на bl.ocks.org.

Я загружаю узлы из файла JSON, но я не могу понять, как установить цвет узлов (изначально любой цвет, но в идеале я хотел бы предоставить цвет узлов в JSON).

Код: (скопировано с bl.ocks.org)

var canvas = document.querySelector("canvas"),
    context = canvas.getContext("2d"),
    width = canvas.width,
    height = canvas.height;

var simulation = d3.forceSimulation()
    .force("link", d3.forceLink().id(function(d) { return d.id; }))
    .force("charge", d3.forceManyBody())
    .force("center", d3.forceCenter(width / 2, height / 2));

d3.json("../data/prc_network.json", function(error, graph) {
  if (error) throw error;

  simulation
      .nodes(graph.nodes)
      .on("tick", ticked);

  simulation.force("link")
      .links(graph.links);

  d3.select(canvas)
      .call(d3.drag()
          .container(canvas)
          .subject(dragsubject)
          .on("start", dragstarted)
          .on("drag", dragged)
          .on("end", dragended));

  function ticked() {
    context.clearRect(0, 0, width, height);

    context.beginPath();
    graph.links.forEach(drawLink);
    context.strokeStyle = "#aaa";
    context.stroke();

    context.beginPath();
    graph.nodes.forEach(drawNode);
    context.fill();
    context.strokeStyle = "#fff";
    context.stroke();
  }

  function dragsubject() {
    return simulation.find(d3.event.x, d3.event.y);
  }
});

function dragstarted() {
  if (!d3.event.active) simulation.alphaTarget(0.3).restart();
  d3.event.subject.fx = d3.event.subject.x;
  d3.event.subject.fy = d3.event.subject.y;
}

function dragged() {
  d3.event.subject.fx = d3.event.x;
  d3.event.subject.fy = d3.event.y;
}

function dragended() {
  if (!d3.event.active) simulation.alphaTarget(0);

}

function drawLink(d) {
  context.moveTo(d.source.x, d.source.y);
  context.lineTo(d.target.x, d.target.y);
}

function drawNode(d) {
  context.moveTo(d.x + 3, d.y);
  context.arc(d.x, d.y, 3, 0, 2 * Math.PI);
}

</script>

1 Ответ

0 голосов
/ 02 мая 2018

Вам нужно начинать новый путь каждый раз, когда вы хотите покрасить один узел - так как каждый путь имеет заданный стиль. Для этого нам нужно переместить все части чертежа узла в функцию drawNode, а не в функцию tick, чтобы мы могли стилизовать каждый узел по отдельности:

function drawNode(d) {
  context.beginPath(); 
  context.moveTo(d.x + 3, d.y);
  context.arc(d.x, d.y, 3, 0, 2 * Math.PI);
  context.fillStyle = d.color // or some other property that has a valid color
  context.fill();
  context.strokeStyle = "#fff";
  context.stroke();
}

Мы также можем использовать шкалу, чтобы взять какое-либо свойство и преобразовать его в цвет:

var colors = d3.scaleOrdinal().range(d3.schemeCategory20);

function drawNode(d) {
  context.beginPath(); 
  context.moveTo(d.x + 3, d.y);
  context.arc(d.x, d.y, 3, 0, 2 * Math.PI);
  context.fillStyle = colors(d.property);
  context.fill();
  context.strokeStyle = "#fff";
  context.stroke();
}

Вот блок с использованием базового примера (с базовыми данными) раскраски для группы узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...