Подтвердить что ты не робот

Существуют ли директивы AngularJS для D3JS?

Мне понадобятся некоторые базовые диаграммы для одного из моих приложений, но я бы хотел использовать D3JS, если мне удастся обогнуть его вовремя, чтобы выполнить требования к проекту. Я по-прежнему развиваю свое понимание SVG и D3JS, поэтому могу эффективно использовать его, до сих пор я смог создать очень базовую гистограмму, которая берет 2-мерные массивы и показывает гистограммы, основанные на длине каждого массива в массив верхнего уровня. Это очень хорошо работает (хотя он может использовать некоторые метки украшения/оси и т.д.). Следующий вид диаграммы, на которой я собирался работать, - это круговая диаграмма, так как они также очень распространены.

В основном, мне интересно, кто-нибудь знает, если кто-то уже это сделал и отправил в github (или поделился источником в другом месте), поэтому мне не нужно начинать с нуля здесь. Я понимаю, что D3JS используется для отображения пользовательских данных, но я просто хочу, чтобы это было основополагающим, а также возможностью настройки. Так кто знает об усилиях по созданию директив для D3JS и/или тех, кто знает о чем-то, где описываются все основные типы диаграмм в D3JS (я продолжаю находить сложные примеры, которые выглядят потрясающе, но я боюсь, что я не буду понимать/учиться у них).

В принципе, я просто хотел бы иметь простой способ зайти (а затем стиль) следующие диаграммы: bar, line, pie (другие стандартные типы диаграмм, о которых я не думаю, приветствуются). Также я видел варианты Google Charts и High Charts, которые оба хороши и дают вам немного этого из коробки, но чаще всего предпочитаю наращивание, а не полосу в большинстве случаев.

Также я знаю и использовал эту статью, чтобы сделать исходную гистограмму, которая мне нужна (смешение с другим прямой учебник D3JS), но есть ли больше усилий, о которых кто-либо знает?

Вот моя базовая диаграмма:

.directive('barChart', function ( /* dependencies */ ) {
  // define constants and helpers used for the directive

  var width = 500,
    height = 80;

  return {
    restrict: 'E', // the directive can be invoked only by using <bar-chart></bar-chart> tag in the template
    scope: { // attributes bound to the scope of the directive
      val: '='
    },
    link: function (scope, element, attrs) {
      // initialization, done once per my-directive tag in template. If my-directive is within an
      // ng-repeat-ed template then it will be called every time ngRepeat creates a new copy of the template.

      // set up initial svg object
      var vis = d3.select(element[0])
        .append("svg")
          .attr("class", "chart")
          .attr("width", width)
          .attr("height", height);


      // whenever the bound 'exp' expression changes, execute this 
      scope.$watch('val', function (newVal, oldVal) {

        // clear the elements inside of the directive
        vis.selectAll('*').remove();

        // if 'val' is undefined, exit
        if (!newVal) {
          return;
        }

        var totalDataSetSize = 0;

        for (var i = 0; i < newVal.length; i++) {
          totalDataSetSize += newVal[i].length
        };

        function calcBarWidth(d) {
          return (totalDataSetSize==0)?0:d.length/totalDataSetSize*420;
        }

        vis.selectAll("rect")
            .data(newVal)
          .enter().append("rect")
            .on("click", function(d,i) {alert("Total gardens: "+ d.length)})
            .attr("y", function(d, i) { return i*20; })
            .attr("width", calcBarWidth)
            .attr("height", function(d) {return 20});

        vis.selectAll("text")
            .data(newVal)
          .enter().append("text")
            .attr("x", function(d) { return calcBarWidth(d)+50})
            .attr("y", function(d, i) { return (i+1)*20; })
            .attr("dx", -3) // padding-right
            .attr("dy", "-.3em") // vertical-align: middle
            .style("font-size", ".7em")
            .attr("fill", "black")
            .attr("text-anchor", "end") // text-align: right
            .text(function(d,i){ var yesOrNo = i?" No":" Yes"; return d.length.toString() + yesOrNo})

      },true);
    }
  };
});

Любые советы/указатели на этот код также приветствуются, поскольку я сказал, что все еще новичок с D3JS и до сих пор довольно новичок в Angular.

4b9b3361

Ответ 3

Мне кажется, что мое первоначальное исследование было не таким хорошим, я просто натолкнулся на это, похоже, что он охватывает то, что я хочу:

http://phloxblog.in/angulard3/start.html#.Ui9XPBKJB-M

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

-------------------------- Редактировать 1

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

-------------------------- Редактировать 2

Чтение в теме более есть некоторые другие образцы, которые также имеют установку класса с целью абстрагирования/развязки кода D3 из кода AngularJS (чтобы разрешить расширение - один из аргументов, который я видел).

http://bl.ocks.org/biovisualize/5372077

Ответ 4

Я построил набор расширяемых директив для использования D3 для создания диаграмм. Они довольно гибкие, и я уже широко их использую. Вы можете получить пакет от Bower, а также "angularD3".

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

Корневая директива <d3-chart> действует как контейнер и контроллер для различных компонентов диаграммы, таких как ось, линии, области, дуги, градиенты и т.д. d3ChartController позволяет вам легко писать свои собственные директивы диаграмм. Мы используем это сами для некоторых специализированных пользовательских меток и т.д.

Вот пример того, как вещи объявлены:

 <d3-data src="data/data.csv" data="line" columns="year, savings, total, optimal"></d3-data>
 <d3-data src="data/donutData.csv" data="pie" columns="age,population"></d3-data>
 <div d3-chart>
   <d3-axis data="line" name="year" label="Year" extent="true" orientation="bottom" ticks="5"></d3-axis>
   <d3-axis data="line" name="savings" label="Deposits" orientation="left" ticks="5"></d3-axis>
   <d3-axis data="line" name="total" label="Savings" orientation="right" ticks="5"></d3-axis>
   <d3-line data="line" x="year" y="optimal" yscale="total"></d3-line>
 </div>

Ответ 5

Там также dangle.js. Это должно быть для результатов elasticsearch, но, откровенно говоря, достаточно надежное, чтобы вы могли использовать его для многих других случаев использования.

Ответ 6

Мне было бы неплохо, если бы AngularJS мог интегрировать d3, как это было с бутстрапом. В этом разделе нет ничего нового (angular и d3). Большинство директив d3 (кроме nvd3) - два года. Вот еще одна статья с 2013 года, но идея более устойчива. Вы используете новейший d3 только для вычислений. И вы используете native angular для манипуляции с dom. Недостатком является то, что я не смог получить переходы, выполняемые этим подходом.