ホームページ ウェブフロントエンド jsチュートリアル Angularjsおよびd3.jsを使用したチャートディレクティブの作成

Angularjsおよびd3.jsを使用したチャートディレクティブの作成

Feb 21, 2025 pm 12:19 PM

Creating Charting Directives Using AngularJS and D3.js

コアポイント

  • d3.jsは、angularjsと組み合わせて使用​​してSVG(スケーラブルベクトルグラフィックス)を使用してインタラクティブなリアルタイムチャートを作成できるJavaScriptライブラリです。この組み合わせにより、開発者は動的なデータ視覚化を備えたリッチなWebアプリケーションを作成できます。
  • angularjsおよびd3.jsをHTMLページに設定して、チャートディレクティブを作成できます。これには、AngularJSコントローラーと手順の作成、およびコントローラーを使用してチャートに描画するデータを保存することが含まれます。次に、この指令を使用して、d3.jsを使用して行チャートを描画できます。
  • クリックをリアルタイムで更新して、基礎となるデータの変更を反映できます。これは、命令にコレクションオブザーバーを使用してコレクションデータの変更を監視し、変更が検出されたときにチャートを再描画することで実行できます。
  • d3.jsは、Angularおよびその他のJavaScriptフレームワークの他のバージョンで使用できます。データの更新を処理するために使用できる強力なデータバインディングシステムを提供し、AngularJSはアプリケーションを構築し、データの更新を処理するための構造化された方法を提供します。

D3は、HTML5テクノロジースケーラブルベクトルグラフィックス(SVG)を使用してインタラクティブなチャートを作成するために使用できるJavaScriptライブラリです。 SVGでサポートされている形状を覚えていて、チャートを動的にするためにAPIを複数回呼び出す必要があるため、SVGで直接チャートを作成する必要があるため、痛みを伴う場合があります。 D3はほとんどの痛みを排除し、SVGベースのチャートを構築するための簡単なインターフェイスを提供します。 Jay Rajは、D3に精通していない場合は、2つの良いSitePointの記事を公開しています。

あなたのほとんどは、Angularjsを正式に導入する必要がないかもしれません。 AngularJSは、豊富なWebアプリケーションを構築するためのクライアント側JavaScriptフレームワークです。 AngularJSの主な利点の1つは、指示のサポートです。ディレクティブは、独自のHTML属性と要素を定義する優れた方法を提供します。また、タグとコードを互いに分離するのにも役立ちます。

AngularJSは、データバインディングにおいても非常に強力です。この機能は、モデルのデータに基づいてUIを更新するために必要な時間と労力を節約します。現代のオンラインの世界では、顧客は開発者にリアルタイムのレスポンシブWebサイトを構築するように依頼します。これは、顧客が画面上の最新のデータを常に表示したいことを意味します。誰かがバックエンドのデータを変更したら、データUIを更新する必要があります。データバインディングのサポートがない場合、このようなリアルタイムの更新を実行することは非常に困難で非効率的です。

この記事では、D3チャートをラップするリアルタイムのAngularJSディレクティブを構築する方法を学びます。

環境環境

最初に、環境をセットアップする必要があります。 HTMLページにAngularJとD3を含める必要があります。 1つのチャートディレクティブのみを構築するため、AngularJSコントローラーと1つの指令を作成する必要があります。コントローラーでは、チャートにプロットするデータを保持するコレクションが必要です。次のコードスニペットには、初期コントローラーと命令が表示されます。後でこれらのコンポーネントにさらにコードを追加します。

var app = angular.module("chartApp", []);

app.controller("SalesController", ["$scope", function($scope) {
  $scope.salesData = [
    {hour: 1,sales: 54},
    {hour: 2,sales: 66},
    {hour: 3,sales: 77},
    {hour: 4,sales: 70},
    {hour: 5,sales: 60},
    {hour: 6,sales: 63},
    {hour: 7,sales: 55},
    {hour: 8,sales: 47},
    {hour: 9,sales: 55},
    {hour: 10,sales: 30}
  ];
}]);

app.directive("linearChart", function($window) {
  return{
    restrict: "EA",
    template: "<svg height='200' width='850'></svg>",
    link: function(scope, elem, attrs){
    }
  };
});
ログイン後にコピー

上記の手順にリンク関数を設定して、コントローラーに保存されているデータを使用し、D3を使用してラインチャートを描画します。指令のテンプレートには、SVG要素が含まれています。この要素にD3のAPIを適用して、チャートを描画します。次のコードスニペットには、指令の使用例が表示されます。

<div linear-chart chart-data="salesData"></div>
ログイン後にコピー
次に、チャートを描くために必要な基本的なデータを収集しましょう。描画するデータ、SVG要素のJavaScriptオブジェクト、およびその他の静的データが含まれます。

var salesDataToPlot=scope[attrs.chartData];
var padding = 20;
var pathClass = "path";
var xScale, yScale, xAxisGen, yAxisGen, lineFun;

var d3 = $window.d3;
var rawSvg = elem.find("svg")[0];
var svg = d3.select(rawSvg);
ログイン後にコピー
D3ライブラリをロードした後、D3オブジェクトはグローバル変数として使用できます。ただし、コードブロックで直接使用する場合、そのコードブロックをテストすることは困難です。ディレクティブをテスト可能にするために、オブジェクトを

で使用します。 $window

シンプルなラインチャートを描きます

チャートを描画するために必要なパラメーターを設定しましょう。チャートには、これらの軸を表すX軸、Y軸、およびデータフィールドが必要です。この例では、X軸は時間の時間を表します。配列内の最初と最後の値を取得できます。 Y軸では、可能な値はゼロから最大販売の範囲です。最大販売は

を使用して見つけることができます。軸の範囲は、SVG要素の高さと幅によって異なります。 d3.max()

上記の値を使用して、d3に目的の方向とスケールの数で軸を描く必要があります。最後に、上記で定義したスケールに基づいて線を描画するために

を使用して関数を定義する必要があります。上記のすべてのコンポーネントは、ディレクティブテンプレートのSVG要素に接続する必要があります。アイテムを添付するときに、チャートにスタイルと変換を適用できます。次のコードはパラメーターを設定し、それらをsvgに追加します:d3.svg.line()

function setChartParameters(){
  xScale = d3.scale.linear()
             .domain([salesDataToPlot[0].hour, salesDataToPlot[salesDataToPlot.length - 1].hour])
             .range([padding + 5, rawSvg.clientWidth - padding]);

              yScale = d3.scale.linear()
                .domain([0, d3.max(salesDataToPlot, function (d) {
                  return d.sales;
                })])
             .range([rawSvg.clientHeight - padding, 0]);

  xAxisGen = d3.svg.axis()
               .scale(xScale)
               .orient("bottom")
               .ticks(salesDataToPlot.length - 1);

  yAxisGen = d3.svg.axis()
               .scale(yScale)
               .orient("left")
               .ticks(5);

  lineFun = d3.svg.line()
              .x(function (d) {
                return xScale(d.hour);
              })
              .y(function (d) {
                return yScale(d.sales);
              })
              .interpolate("basis");
}

function drawLineChart() {

  setChartParameters();

  svg.append("svg:g")
     .attr("class", "x axis")
     .attr("transform", "translate(0,180)")
     .call(xAxisGen);

   svg.append("svg:g")
      .attr("class", "y axis")
      .attr("transform", "translate(20,0)")
      .call(yAxisGen);

   svg.append("svg:path")
      .attr({
        d: lineFun(salesDataToPlot),
        "stroke": "blue",
        "stroke-width": 2,
        "fill": "none",
        "class": pathClass
   });
}

drawLineChart();
ログイン後にコピー

チャートのリアルタイムアップデート 前述のように、今日のネットワークの機能により、ユーザーは、基礎となるデータが変更されたときにすぐにデータチャートの更新を確認したいと考えています。 WebSocketなどのテクノロジーを使用して、クライアントに変更をプッシュできます。作成したばかりのチャート指令は、これらの変更に応答し、チャートを更新できる必要があります。

websocketを介してデータをプッシュするには、socket.ioおよびnode.js、SignalRおよび.NETまたはその他のプラットフォームを使用して構築されたサーバーコンポーネントが必要です。このデモでは、AngularJSの

サービスを使用して、1秒の遅延で10のランダム販売値を販売アレイにプッシュします。

$interval新しいデータがプッシュされた直後にチャートを更新するには、更新されたデータを使用してチャートを再描画する必要があります。コレクションオブザーバーは、コレクションデータの変更を監視するために指令で使用する必要があります。コレクションに変更が加えられると、オブザーバーが呼び出されます。チャートはオブザーバーで再描画されています。

$interval(function() {
  var hour = $scope.salesData.length + 1;
  var sales = Math.round(Math.random() * 100);

  $scope.salesData.push({hour: hour, sales: sales});
}, 1000, 10);
ログイン後にコピー

結論
scope.$watchCollection(exp, function(newVal, oldVal) {
  salesDataToPlot = newVal;
  redrawLineChart();
});

function redrawLineChart() {

  setChartParameters();
  svg.selectAll("g.y.axis").call(yAxisGen);
  svg.selectAll("g.x.axis").call(xAxisGen);

  svg.selectAll("." + pathClass)
     .attr({
       d: lineFun(salesDataToPlot)
     });
}
ログイン後にコピー

AngularJとD3は、Web上に豊富なビジネスアプリケーションを構築するための非常に便利なライブラリです。それらを一緒に使用して簡単なチャートを作成する方法について説明しました。この知識を拡張して、アプリケーションのチャートを作成できます。

(スペースの制限のため、FAQの部分はここで省略されています。FAQSパーツの内容は元のテキストと一致しており、書き換えは必要ありません。)

以上がAngularjsおよびd3.jsを使用したチャートディレクティブの作成の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles