2014-02-11 3 views
2

У меня есть макет пакета, в котором некоторые объекты имеют нулевое значение. Я пытаюсь найти способ установить радиус по умолчанию для них. Согласно документу, я надеялся, что я мог бы написать что-то вроде этогоМинимальный радиус компоновки пакета окружности

pack.radius(function(r){ 
    return r==0 ? MIN_RADIUS : oldRadiusFunction(r); 
}); 

Но не имел никакого успеха до сих пор в определении того, как получить доступ к «oldRadiusFunction».

Ближайший я пришел к решению это, выполнив:

pack.radius(function(r){ 
    return r== 0 ? MIN_RADIUS : p.radius(null)(r); 
}); 
var p = this.pack; 

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

В любом случае, любая помощь будет очень признательна, спасибо за ваше внимание и внимание!

Редактировать: Вот то, что документы говорят

pack.radius ([радиус])

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

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

+0

Здесь вы должны указать нам больше контекста. Что такое 'oldRadiusFunction' и где оно определено? Как вы получаете «странные» результаты? –

+0

Я не знаю, что такое 'oldRadiusFunction', это именно то, что я ищу:) ...И я получаю странные результаты, как только я начинаю обновлять значения объектов. –

+0

Не могли бы вы привести полный пример? Я не могу сказать вам, какова должна быть ваша функция радиуса, не имея представления о том, что вы пытаетесь сделать. –

ответ

0

Если положить следующий код в инициализации круг упаковки:

.value(function(d){return Math.max(0.01, d.size);}); 

ваша проблема исчезнет. Однако вам нужно будет настроить 0,01, чтобы получить нужный (нужный) минимальный радиус, или добавить больше кода для обработки радиуса, но вы ДОЛЖНЫ иметь код выше, если у вас есть размеры 0 в ваших данных, иначе круговой пакет даст очень забавные и неправильные макеты ... (я узнал это нелегко, по опыту)

Вот jsfiddle, который я сделал для другого случая, но он также имеет элементы размером 0 и иллюстрирует, что приведенный выше код работает.

Это потому, что она применяется перед тем расположение вычисляется несколько строк далее в

.data(pack.nodes({blocks:data})) 

Это также объясняет, почему ваше решение не работает (он был применен после вычисления макета). Кроме того, то, что должно быть не-0, - это значения (в них рассчитывается макет пакета), а не радиусы (это, в общем говоря, результат расчетов макета). :)

Надеюсь, это поможет.

Смежные вопросы