Линейный график d3 js принимает два разных формата данных. как мне отличить эти два? - PullRequest
0 голосов
/ 29 марта 2020

При изучении анимированной линейной диаграммы d3.

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

Два случая, как показано ниже .

1) первый случай - рисование линии с помощью .attr (d, line (data)) 2) второй случай - рисование линии с помощью .attr (d, function (d) {return line (d)})

Почему в некоторых случаях линия рисуется простым вызовом функции line, а в другом случае я запрашиваю создание анонимной функции и помещаю в нее функцию line?

Вот примеры примеров, которые я натолкнулся на.

1) пример один случай
https://bl.ocks.org/pjsier/28d1d410b64dcd74d9dab348514ed256

2) пример два случай
https://bl.ocks.org/phvaillant/53b90038b9c5ac5f6b817a4f63fbc2af

1 Ответ

1 голос
/ 29 марта 2020

Всякий раз, когда вы видите function(d) {...} в качестве параметра .attr(), .style(), .data(), .datum(), .each() и некоторых других, d относится к привязанному элементу каждого элемента в выбор.

Но если вы видите линию, нарисованную как в первом подходе:

.attr("d", line(data))`

Каждый элемент в выделении будет иметь одну и ту же строку: line(data) будет возвращать одно и то же значение для каждого элемент в выборе. Этот подход может быть использован, если вы не привязали какие-либо данные к выбору. Чтобы нарисовать несколько разных линий, нам нужно было бы использовать al oop некоторого вида и изменить значение data. Если вы привязываете данные к выделению (что является ключевой целью D3), вы должны использовать эти привязанные данные, как во втором подходе - будет проще, если вы решите иметь более одной строки.

В второй подход:

.attr("d", function(d) { return line(d); })

Связанный элемент данных каждого элемента в выделении передается в line(), так как привязанный элемент данных для каждой строки может быть разным, вы можете иметь разные строки без явного l oop. Для нескольких строк это, безусловно, будет идиоматический метод c, хотя для отдельных строк, если честно, разница весьма незначительна.


Я на самом деле не видел .attr("d", line(data)) в первой ссылка примера, ссылка первого примера вместо этого имеет .attr("d", line), что эквивалентно второму примеру:

Во втором примере это:

.attr("d", function(d) { return line(d); })

эквивалентно:

.attr("d", line);

В более простой строке привязанные данные передаются в line, а line выполняется для каждого элемента в выборе. Вот тот же блок обновленный для демонстрации.

...