Оооо, это одна была головоломка ...
Если вы посмотрите на код графического NYTimes, он использует предварительно вычисленные координаты в файле данных, так что это не много пользы.
Однако в начале скрипта есть неиспользованное объявление переменной, в котором намекает, что исходная версия использовала d3.geom.quadtree
для выкладки кругов. Квадратура на самом деле не является способом компоновки; он используется для создания дерева поиска соседних узлов, так что, когда вам нужно найти узел в данной области, вам не нужно искать весь набор. Example here.
Таким образом, квадрант может использоваться для определения того, какие из ваших точек данных могут перекрываться друг с другом по оси x. Затем вы должны выяснить, сколько вам нужно, чтобы компенсировать их, чтобы избежать дублирования. Переменные радиусы осложнят обе функции ...
У меня есть тестовый пример реализован здесь: http://fiddle.jshell.net/6cW9u/5/
Алгоритм упаковка не является совершенным: Я всегда добавлять новые круги наружу существующих кругов, без проверяя, могут ли они подойти ближе, поэтому иногда вы получаете значительные лишние пробелы, когда это только крайние края окружностей натыкаются друг на друга. (Запустите его несколько раз, чтобы получить представление о возможностях - обратите внимание, что у меня есть x-переменные, распределенные как случайные нормальные и r-переменные, распределенные как случайные униформы.) Я также получил переполнение стека по рекурсивным методам во время одного итерации с N = 100 - случайное распределение явно недостаточно распределялось для оптимизации квадранта.
Но у него есть базовая функциональность. Оставьте комментарий здесь, если вы не можете следовать логике комментариев к коду.
--ABR
Update
Новой скрипка здесь: http://fiddle.jshell.net/6cW9u/8/
После долгой перестановки, я получил алгоритм упаковки для поиска пробелов между существующими пузырями. У меня упорядоченный порядок сортировки (так что первые круги добавляются в первую очередь), чтобы показать, как маленькие круги могут быть добавлены в пробелы - хотя, как я упоминаю в комментариях к коду, это снижает эффективность поиска quadtree.
Также добавлено различное украшение и переход, чтобы вы могли четко видеть, как расположены круги, и установите r-масштаб в квадратный корень, поэтому площадь (не радиус) пропорциональна значению в данных (что более реалистично, и то, о чем попросил ОП).
Если это прямая все, что вам нужно будет сделать, это суммируют диаметры предыдущих кругов, чтобы получить позицию для нового круга. –
@LarsKotthoff: Не могли бы вы немного рассказать (я обновил вопрос)? – jrydberg