- WebGPUを活用して大規模データセットを滑らかにレンダリングするオープンソースのチャートライブラリ
- TypeScriptで書かれており、ライン・エリア・棒・散布図・円・ローソク足など多様なシリーズタイプをサポート
- ホバーハイライト、ツールチップ、クロスヘア、ズームジェスチャー、テーマプリセットなどのインタラクション機能を内蔵
- **React統合パッケージ(chartgpu-react)**により、React環境でも簡単に利用可能
- WebGPUアクセラレーションレンダリングにより毎秒60フレーム級の性能を提供し、大規模データ可視化に適したツール
概要
- ChartGPUはWebGPUベースの高性能チャートレンダリングライブラリで、大量のデータを滑らかに可視化できる
- TypeScriptで開発され、MITライセンスで公開
npm install chartgpu コマンドでインストール可能
主な機能
- WebGPUアクセラレーションレンダリングにより、大規模データセットでも高いFPSを維持
- 多様なチャートタイプをサポート: line, area, bar, scatter, pie, candlestick
- インタラクション機能を内蔵: hover highlight, tooltip, crosshair
- データストリーミング更新をサポート(
appendData(...))
- X軸ズーム機能を提供(ジェスチャーおよびスライダーUIを含む)
- テーマプリセット(
dark / light)およびカスタムテーマをサポート
アーキテクチャ
ChartGPU.create(...) がキャンバスとWebGPUライフサイクルを管理し、レンダリングの調整はRender Coordinatorが担当
- 内部構造は次のようなレイヤーで構成
- WebGPU Core: GPUアダプタおよびデバイスの初期化、キャンバス設定
- Render Coordinator: レイアウト、スケール、データアップロード、レンダーパス管理
- GPU Renderers: Grid、Area、Bar、Scatter、Line、Pie、Candlestickなど各チャート用レンダラー
- Shaders(WGSL): 各レンダラーに対応するシェーダーファイルで構成
- Chart Sync: 複数チャート間のクロスヘア同期機能を提供
React統合
ブラウザ対応
- WebGPUが有効なブラウザが必要
- Chrome 113+、Edge 113+、Safari 18+ をサポート
- Firefoxは現在開発中
1件のコメント
Hacker Newsのコメント
uPlotのメンテナーです。このプロジェクトが興味深いので、近いうちに詳しく見てみる予定です
1Mデモを少し見た感想としては、
[[0,1],[1,3],[2,2]]のようなデータ形式は数百万個の小さな配列を作る必要があるため、カラム指向のデータ構造に変えるのがよいです参考までに、uPlotの2Mデータポイントデモもあります
LTTBサンプリングとidle時のCPU問題はいずれももっともな指摘で、サンプリングはデモではデフォルトで有効ですが、
sampling: noneで公平に比較できます。UIにトグルを追加する予定です。停止状態でもレンダーループが回り続ける問題は修正可能です。データ変更やインタラクション時にのみレンダリングするよう改善する予定です
ラインチャートの場合、隣接ポイント間のピクセル単位の差に基づいて適応的サンプリングを行えば、ほとんどのポイントを捨てても見た目の違いはありません。
幅1000ピクセルのチャートに100万ポイントを描くのは非効率です
データポイントが非常に多い場合は、各ピクセルがカバーするポイント数を数えて明るさや色で強度(intensity) を表現するのがよいです
電子工学のデジタルフォスファ(digital phosphor) 方式に似ています。例はこのリンクを参照
特にscatter plotでクラスタ構造を明らかにするのに有用です。アイデア一覧に追加します
idle時のCPU使用量パッチを完了しました。
1Mベンチマーク例に「Benchmark mode」トグルを追加し、ベンチマーク機能を維持しつつ非アクティブ時にも効率よく動作するようにしました
FPSが0と表示されても正常です — 描画するものがなければフレームは描きません。必要なときには即座に最大速度でレンダリングされます
コミュニティの熱意あるフィードバックに感動しました
ブラウザベースのLink Graph分析ツールを開発中です(webvetted.com/workbench)
数千のノード/エッジを扱うグラフを可視化する必要があるのですが、1Mポイントを処理できるなら大いに役立ちそうです
ただし、WebGPUのレンダリングパターンはグラフ可視化にも十分応用できます。scatterレンダラーはすでに数千インスタンスを処理しているので、エッジを追加することも構造的には難しくありません
グラフ機能をChartGPUに統合するか、別のGraphGPUライブラリとして分離するか意見を求めています
印象的です。最も印象的なデモの1つだと感じました
ローソク足向けのラインおよびバンド描画機能を追加するとよいと思います。単にプロットするだけでなく、ポイントを強調できるべきです
以前、似たものを自分でWebGPUで作ろうとしていましたが、このプロジェクトを見て実際に使ってみたくなりました
TimeLineのメンテナーです。ChartGPUのライブストリーミングデモ(リンク)は期待したほど滑らかではありません
比較のため、メインスレッドで2Dキャンバスとして実装したこのデモのほうがずっと滑らかに動作します
関連ファイルはwebgpu-pro.mdとwebgpu-expert.mdを参照
1Mポイントの例でスライダーのバグを見つけました(リンク)
ドラッグ中、スライダーがカーソルの下に留まらず、予期しない距離だけ移動してしまいます
データズームスライダーの座標マッピング問題で、優先度を上げて修正する予定です
祝福しますが、1Mポイントは金融分野では普通の水準です
現在開発中のレンダリングエンジンは、従来の1000万ポイントから1億ポイントまで性能を引き上げました
デモ動画を参照
Plotlyはすでに何年も前からWebGLで1000万点以上のポイントを処理できました
同様の機能を持つライブラリは多数あります
性能デモを参照