世界を動かす技術を、日本語で。

Show HN: ChartGPU – WebGPUを活用したグラフ描画ライブラリ(1Mポイントで60fps)

概要

ChartGPUは WebGPUベース のTypeScript製チャートライブラリ。 大規模データ でも高FPSで滑らかな描画を実現。 多彩なチャート種別 ・インタラクション・テーマ対応。 React連携やライブデモも用意。 MITライセンスでnpmから 導入可能

ChartGPUの特徴

  • WebGPUアクセラレーション による大規模データの高速描画
  • 対応チャート種別 :折れ線、エリア、棒、散布図、円グラフ、ローソク足
  • インタラクション機能 :ホバー時のハイライト、ツールチップ、クロスヘア
  • データストリーミング :appendData(...)でリアルタイム更新
  • X軸ズーム :ピンチ操作やスライダーUI対応
  • テーマ切替 :ダーク/ライトプリセット、カスタムテーマも可能

基本アーキテクチャ

  • ChartGPU.create(...) がcanvasとWebGPUライフサイクルを管理
  • レンダーコーディネーター が描画処理(レイアウト、スケール、データ転送、レンダーパス、内部オーバーレイ)を統括
  • API詳細や内部設計は docs/API.md 参照

主な処理フロー

  • ユーザーアプリPublic API(src/index.ts)ChartGPU.create(container, options)
  • WebGPUサポートチェック、canvas生成、オプション解決、GPU初期化、レンダーコーディネーター生成
  • ChartGPUインスタンスAPI :setOption, appendData, resize, requestAnimationFrame
  • イベント・ヒットテスト :クリック/マウスオーバー/アウト、findNearestPoint, findPieSlice
  • データズームスライダーUI も連携可能

WebGPUコア

  • GPUContext でアダプタ/デバイス取得、canvasコンフィグ
  • レンダーコーディネーター がレイアウト、スケール、データアップロード、レンダーパス管理
  • 内部オーバーレイ :イベント管理、ヒットテスト、クロスヘア、DOMラベル/ツールチップ表示

GPUレンダラー・シェーダ

  • 各種チャート描画 :Grid, Area, Bar, Scatter, Line, Pie, Candlestick, Crosshair, Highlight, Axis
  • WGSLシェーダ で各描画タイプを最適化

チャート同期

  • connectCharts で複数チャートのクロスヘア同期
  • 'crosshairMove'リッスン、setCrosshairXで相互連携

クイックスタート

  • インストール
    npm install chartgpu
    
  • 基本利用例
    import { ChartGPU } from 'chartgpu';
    const container = document.getElementById('chart')!;
    await ChartGPU.create(container, {
      series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
    });
    

React連携

  • chartgpu-reactパッケージ利用
    npm install chartgpu-react
    
    import { ChartGPUChart } from 'chartgpu-react';
    function MyChart() {
      return (
        <ChartGPUChart options={{
          series: [{ type: 'line', data: [[0, 1], [1, 3], [2, 2]] }],
        }} />
      );
    }
    
  • 詳細・サンプル はchartgpu-reactリポジトリ参照

対応ブラウザ

  • Chrome 113+ / Edge 113+ (WebGPU標準対応)
  • Safari 18+ (WebGPU標準対応)
  • Firefox :未対応(開発中)

ドキュメント・開発

  • 公式ドキュメント :Getting Started, APIリファレンス(docs/API.md)
  • サンプル閲覧 :examples/ ディレクトリ
  • ローカル実行
    npm install
    npm run dev
    # http://localhost:5176/examples/
    
  • コントリビュート :CONTRIBUTING.md参照
  • ライセンス :MIT

ChartGPU開発の背景と技術的ポイント

  • 従来のチャートライブラリ は10万点超でパフォーマンス低下
  • Canvas2D はCPU依存がボトルネック
  • WebGL製チャート も多くの処理がCPU側
  • ChartGPUのコア発想 :全処理をGPU(WebGPU)へ
    • LTTBダウンサンプリング をコンピュートシェーダ化
    • ヒットテスト (ツールチップ/ホバー)もGPU処理
    • インスタンシング描画 :1シリーズ1ドローコール
  • 結果 :100万点でも60fpsで滑らかズーム・パン
  • ライブデモ1Mポイントデモ
  • MITライセンス・npm配布npm install chartgpu
  • WebGPU内部や設計についての質問歓迎

対応チャートタイプまとめ

  • Line (折れ線)
  • Area (エリア)
  • Bar (棒グラフ)
  • Scatter (散布図)
  • Pie (円グラフ)
  • Candlestick (ローソク足・OHLC対応、スタイル/色カスタマイズ)

参考リンク集

  • 公式ドキュメント・リポジトリ :docs/API.md, examples/
  • Reactバインディング :chartgpu-react, chartgpu-reactリポジトリ
  • ライブデモChartGPU Live Demo
  • npmnpm install chartgpu
  • ライセンス :MIT

Hackerたちの意見

すごくクールだね!デモのバリエーションが気に入った!キャンドルスティックのストリーミングデモでは、1s/5m/15mのボタンが全然反応しないみたい。

いい発見だね!実際にクリックして見つけてくれてありがとう。問題トラッカーに追加したよ。

phrasing [1]のグラフを全部webglに書き直したよ。主に、グラフっぽくないカスタムグラフが欲しかったからなんだけど、同時に何万ものメトリクスをアニメーションさせたかったからでもある。初期設定と学習曲線を乗り越えたら、実際にはすごく簡単だったよ。全体的に、d3を使ってデータの0.01%を半分スムーズに表示させるためにやってたパフォーマンスハックよりもずっと簡単だった。これ、次のレベルに見えるね。計算はすべて単一のo(n)ループで行うようにしてるけど、メインループはまだCPU上で動いてる。素晴らしい!迷ってる人には、GPUチャートは最初はクレイジーに思えたけど(典型的な過剰設計)、実際には従来のチャートよりずっとシンプルで(しかもめちゃくちゃスムーズ!)いい感じだよ![1] https://phrasing.app

すごくクールだね。ただ、webglのフォールバックがないのは残念。webgpuの普及が十分になるまで、あと数年かかるだろうね。https://caniuse.com/webgpu

webgpuの拡張サポートもここで見れるよ:https://web3dsurvey.com/webgpu

最新のOSとブラウザを使っていれば、どこでも利用できるよ。最大の問題は、古いMacOSの新しいSafariを使ってるMacユーザーだね。

それに、WebGPUが有効になっていても、実装が壊れてたり効率が悪かったりすることもあるよ。例えば、Firefoxは完了をチェックするのに、めちゃくちゃなポーリングベースのアプローチを使ってるから、パフォーマンスが重要なアプリケーションには使えないんだ。[1] https://bugzilla.mozilla.org/show_bug.cgi?id=1870699 それに、ブラウザが最初に正しいGPUを使うようにする問題もあるけど、それはまた別の話だね。

バグ報告:ミリオンポイントの例のチャート下のスライダーに何か問題があるみたいだ。https://chartgpu.github.io/ChartGPU/examples/million-points/... ドラッグ中、スライダーがカーソルの下に留まらず、予期しない距離で動いてしまう。

ありがとう!これを報告してくれたのは二人目だね!前に報告されたMac M1のスクロールバーのバグと同じ問題だ。データズームスライダーにモメンタム/座標マッピングの問題があるみたい。複数の人がこの問題に直面してるから、優先度を上げておくよ。

ちょうどいいタイミングだね。数ヶ月間、ブラウザベースのリンクグラフ(osint)分析ツールに取り組んでるんだ。https://webvetted.com/workbench 市場にあるグラフチャートツールは、私たちがやりたいチャートにはかなり基本的なものばかりなんだ(1000個以上の接続/非接続ノード/エッジを考えてみて)。1Mポイントを扱えるのは夢みたいだね。これ、すごく役立つよ。

いいプロジェクトだね!ワークベンチを見てきたよ。ただ、正直に言うと、ChartGPUは今のところ伝統的な2Dチャート(ライン、バー、散布、キャンドルスティックなど)に焦点を当てていて、ノードやエッジを使ったグラフ/ネットワークビジュアライゼーションには対応してないんだ。でも、WebGPUのレンダリングパターンは力学的グラフにうまく適用できると思う。散布レンダラーはすでに何千ものインスタンス化されたポイントを処理できるから、エッジに拡張するのも大きな建築的な飛躍ではないはず。グラフビジュアライゼーションはChartGPUの一部として欲しいと思ってるの?それとも別の「GraphGPU」タイプのライブラリの方が良さそうかな?どう考えてるのか気になるな。

同意だね。これはめちゃくちゃ役立つよ。今日これを統合するつもり。

僕の意見だけど、あなたのツールを使うかもしれない人の一人だよ。でも、ウェブサイトにはあんまり情報がないね。もっと製品を詳しく紹介するページを追加した方がいいと思う。そうすれば、もっと多くの人を引きつけられると思うよ。

plot.lyは、10百万ポイント以上のWebGL散布図を何年も前から作成できてるよ。これができるライブラリはたくさんあると思うけど? https://plotly.com/python/performance/

わあ、これはすごい。EasyAnalyticaで大きなデータをレンダリングするのをほぼ諦めかけてたから、何百万ものポイントをプロットするのが悪い体験になっちゃうんだよね、特に複数のチャートがあるダッシュボードでは。今の解決策は、全体像を示すためにダウンサンプリングして、「詳細」データを表示するためにズームを使うことなんだけど、そのコードは脆弱なんだ。もう一つの問題は、いくつかのブラウザとOSの組み合わせがWebGPUをサポートしていないから、これに加えて既存のライブラリに頼らざるを得ないけど、期待できそうな感じはするね。

もしデータポイントがたくさんあるなら、グラフを単純な「バイナリ」表示にする代わりに、強度変調を使うのがクールなトリックだよ。基本的には、各ピクセルがカバーするデータポイントの数を数えて、その値をそのピクセルの色や明るさにマッピングするんだ。そうすれば、データの詳細を視覚的にもっと把握できるようになるよ。電子機器の世界では、これがオシロスコープで「デジタルフォスフォ」などがやってることなんだ。最初はアナログスコープをエミュレートするだけだったけどね。いくつかの例はここで見られるよ。 https://www.hit.bme.hu/~papay/edu/DSOdisp/gradient.htm

いい提案だね!密度マッピングは、重なり合ったデータに対してすごく効果的な手法だよ。ほとんどが重なっている1Mポイントを描く代わりに、ポイントの集中度を示すヒートマップを描く感じ。WebGPUのコンピュートシェーダーがこれにぴったりだと思う。ポイントをグリッドに分けて、セルごとにカウントして、強度を描画することができる。単一のパスでできるかもしれないね。特に散布図について考えてたんだけど、フルズームアウトすると塊に見えるクラスターがあるから、密度モードが構造を明らかにしてくれると思う。アイデアリストに追加したよ、提案ありがとう!

データを読み込みながらスクロールできるかな?カメラから60fpsで取得した心拍数チャートを使ってみたんだけど(カメラに指を置いてフラッシュを使った)、キャンバスでの生描画がライブラリよりも速かったよ。ライブデータを描画してスクロールするのは、どのライブラリか忘れたけど、問題があった。毎フレーム全体を描画してたからね。

そんなに多くのデータポイントを描画する目的って何か見つけた?数千を超えると、判別が難しくなったり、描画する意味が薄れたりする場合が多い気がするんだけど。