21

アプリの 1 つにいくつかの基本的なチャートが必要になる予定ですが、プロジェクトの要件を満たすのに間に合うように頭を包むことができれば、D3JS を使用したいと考えています。SVG と D3JS を効果的に使用できるように、私はまだ SVG と D3JS の理解を深めています。これまでのところ、2 次元配列を取り、各配列の長さに基づいて棒グラフを表示する非常に基本的な棒グラフを作成できました。トップレベルの配列。これはかなりうまく機能します(ただし、装飾/軸ラベルなどを使用できます)。次に取り組む予定のグラフは円グラフです。これらも非常に一般的だからです。

基本的に私が疑問に思っているのは、誰かが既にこれを行って github に投稿した (または他の場所でソースを共有した) かどうかを知っているので、ここでゼロから始める必要はありません。D3JS は非常にカスタムなデータ表示を行うために使用されていることは認識していますが、基本機能とカスタマイズ機能が必要なだけです。D3JS のディレクティブを作成する取り組みを知っている人、および/または D3JS のすべての基本的なチャート タイプの概要を説明している場所を知っている人はいますか (私は複雑な例を見つけ続けていますが、それらは素晴らしく見えますが、理解/学習できないのではないかと心配しています) )。

基本的には、棒グラフ、折れ線グラフ、円グラフ (私が考えていない他の標準的なグラフの種類は大歓迎です) をドロップイン (およびスタイル) する簡単な方法が欲しいだけです。また、私は 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にはまだかなり慣れていないと言ったので、このコードに関するヒント/ポインタも大歓迎です。

4

5 に答える 5

6

d3.js の angular ディレクティブに関する 2 つの github プロジェクトがあります。

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

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

于 2014-01-02T01:11:44.927 に答える
4

うーん、どうやら私の最初の研究はそれほど良くなかったようです。私が欲しいものをカバーしているように見えるこれに出くわしました:

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

それでも、代替手段がある場合は、それらを聞いたり見たりすることにもオープンです。翌日、より良い回答が見られない場合は、この回答を受け入れます。

-------------------------- 編集 1

また、ここでプロトタイプが使用されている理由を誰かが知っている場合は、プロトタイプへの依存関係を削除しようとしていることを知りたいです。

-------------------------- 編集 2

トピックをさらに読むと、D3 コードを AngularJS コードから抽象化/分離する目的でクラス設定を行う他のサンプルがいくつかあります (拡張を可能にすることは、私が見た引数の 1 つです)。

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

于 2013-09-10T17:36:06.670 に答える
4

D3 を使用してチャートを作成するための一連の拡張可能なディレクティブを作成しました。それらは非常に柔軟で、私はすでにそれらを広く使用しています。パッケージは、「angularD3」と同様に Bower から入手できます。

基本的な考え方は、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>
于 2014-06-18T18:01:04.943 に答える
0

AngularJS がブートストラップで行ったように d3 を統合できればいいのですが。このトピック (angular & d3) について新しいことは何もありません。ほとんどの d3 ディレクティブ (nvd3 を除く) は 2 年前のものです。これは 2013 年の別の記事ですが、アイデアはより持続可能です。計算のみに最新の d3 を使用します。また、dom 操作にはネイティブの angular を使用します。欠点は、このアプローチではトランジションを実行できなかったことです。

于 2015-04-01T13:53:32.560 に答える