Как отображать имена рядом с пузырьками в графике движения d3js

В примере с Майком Бостоком http://bost.ocks.org/mike/nations/ так много данных, что размещение названий стран может привести к хаосу, но для небольшого проекта я бы хотел его отобразить.

Я нашел это в источнике:

var dot = svg.append("g")
  .attr("class", "dots")
.selectAll(".dot")
  .data(interpolateData(2004))
.enter().append("circle")
  .attr("class", "dot")
  .style("fill", function(d) { return color(d); })
  .text(function(d) { return d.name; })
  .call(position)
  .sort(order);

dot.append("title")
  .text(function(d) { return d.name; });

Но почему-то название никогда не появляется. У кого-нибудь есть идея, как отобразить имя рядом с пузырем?

3 ответа

К сожалению, объединение текста и кружков в этом случае не поможет. Пузыри перемещаются путем изменения их атрибутов положения (cx и cy), но элементы не имеют положений x и y для перемещения. Их можно перемещать только с помощью transform-translate. Смотрите: https://www.dashingd3js.com/svg-group-element-and-d3js

Ваши варианты здесь:

1) Перепишите функцию положения, чтобы вычислить разницу положения (изменение x и изменение y) между текущей позицией элемента и его новой позицией и примените ее к. ЭТО БЫЛО ОЧЕНЬ ТРУДНО.

или 2) Напишите параллельный набор инструкций для настройки и перемещения тегов. Что-то вроде:

var tag = svg.append("g")
  .attr("class", "tag")
.selectAll(".tag")
  .data(interpolateData(2004))
.enter().append("text")
  .attr("class", "tag")
  .attr("text-anchor", "left")
  .style("fill", function(d) { return color(d); })
  .text(function(d) { return d.name; })
  .call(tagposition)
  .sort(order);

Вам понадобится отдельная функция тегирования, так как тексту нужны атрибуты 'x' и 'y' вместо атрибутов 'cx', 'cy' и 'r'. Не забудьте обновить функцию "displayYear", чтобы изменить положение тега. Возможно, вы захотите сместить текст из пузырьков, но убедиться, что текст не перекрывается, является гораздо более сложной проблемой: http://bl.ocks.org/thudfactor/6688739

PS - Я назвал их тегами, так как "label" уже что-то означает в этом примере.

Как подсказывает другой ответ, вам нужно сгруппировать элементы. Кроме того, вам нужно добавить text элемент - title элемент отображается только как всплывающая подсказка в SVG. Код, который вы ищете, будет выглядеть примерно так.

var dot = svg.append("g")
             .attr("class", "dots")
             .selectAll(".dot")
             .data(interpolateData(2004))
             .enter()
             .append("g")
             .attr("class", "dot")
             .call(position)
             .sort(order);
dot.append("circle")
   .style("fill", function(d) { return color(d); });

dot.append("text")
   .attr("y", 10)
   .text(function(d) { return d.name; });

В призыве к position, вам нужно будет установить transform приписывать. Возможно, вам придется настроить координаты text элемент.

Вы должны обернуть элемент круга и текст вместе, это должно выглядеть

<country>
   <circle ></circle>
   <text></text>
</country>
Другие вопросы по тегам