2013-09-10 3 views
21

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

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

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

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

Вот моя основная гистограмма до сих пор:

.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 и все еще достаточно новый для Угловых.

+1

Не угловые директивы, но [NVD3] (http://nvd3.org/) включает в себя множество базовых и расширенных типов диаграмм, которые вы можете обернуть в такие директивы. –

+0

Вы проверили http://n3-charts.github.io/line-chart/? – LoremIpsum

+1

Проверьте [angular-nvd3] (http://krispo.github.io/angular-nvd3) директиву для nvD3.js. Эта директива повторно используется и может взаимодействовать с полным nvd3 api через JSON. – krispo

ответ

4

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

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

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

-------------------------- Edit 1

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

-------------------------- Edit 2

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

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

19

Что касается использования D3.js с угловой JS, фотографии этой статьи =>http://www.ng-newsletter.com/posts/d3-on-angular.html

+0

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

6

Есть 2 GitHub проектов о угловой директиве для d3.ЯШ:

https://github.com/robinboehm/angular-d3-directives

https://github.com/cmaurer/angularjs-nvd3-directives

+0

https://github.com/cmaurer/angularjs-nvd3-directives работает хорошо для меня - спасибо за ссылку! – StephenT

+0

примечание: последняя фиксация на https://github.com/robinboehm/angular-d3-directives была в 2013 году. – KIC

+0

вот что-то новое, http://n3-charts.github.io/line-chart/#/ – svarog

4

Я построил set of extensible directives для использования 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> 
2

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

0

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

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