Управление порядком окружностей в алгоритме компоновки кругов D3

Мне было интересно, можно ли немного изменить алгоритм упаковки в d3.layout. А именно, я хотел бы знать, можно ли вместо того, чтобы поместить дочерний узел с наивысшим значением в позицию, где он касается родительского узла, поместить его в середину. Прямо сейчас это выглядит так, как будто все дети идут по спирали с самым маленьким ребенком глубоко внутри родителя.

Надеюсь, это не слишком запутанно. Я с удовольствием уточню все, что неясно.

2 ответа

Решение

Это возможно.

Вам нужно только заменить этот код в d3.js:

  function d3_layout_packSort(a, b) {
    return a.value - b.value;
  }

с этим кодом:

  function d3_layout_packSort(a, b) {
    return -(a.value - b.value);
  }

(просто смена знака)

Самые большие круги не будут находиться в самом центре родителя, однако они будут иметь тенденцию быть близко к центру. Насколько я понимаю, вам не нужно точное размещение в центре, только приблизительное, поэтому я надеюсь, что это удовлетворит вашу идею.

Следующее изображение иллюстрирует пример круглой упаковки, полученный с обычным и модифицированным d3.js, бок о бок:

Обычная и модифицированная упаковка

Мне больше нравится модифицированная упаковка.:) Так что, думаю, это была хорошая идея. Проверьте, как это выглядит с вашими данными.

Вы можете получить доступ к этим примерам здесь: обычный, модифицированный.

Мой модифицированный d3.js здесь.

Дайте мне знать, если у вас есть дополнительные вопросы.

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

То есть с кружком на краю, оставшейся частью пространства, пока другой край не может быть использован для других кругов. Если круг находится в центре, до края остается меньше места и, следовательно, меньше места для кругов. Чтобы сохранить визуальную корреляцию между размером и данными, круг в центре должен быть меньше и так далее.

Так что вы говорите не о простой модификации, а об изменении реализованного алгоритма. В зависимости от того, что именно вы пытаетесь сделать, может быть легче достичь этого с помощью другого макета D3.

Другие вопросы по тегам