XY – 高速、コンポーザブル、GPU加速のPythonチャートライブラリ (alpha)

XY – 高速、コンポーザブル、GPU加速のPythonチャートライブラリ (alpha)

XYの概要

XYは、ウェブ、ノートブック、および静的エクスポート向けの、アルファ段階のGPU加速Pythonチャートライブラリです。宣言的またはmatplotlibスタイルのチャート構成が可能で、Python、CSS、またはTailwindを使用して完全にカスタマイズできます。小さなチャートはすべてのポイントをブラウザに送信しますが、大きなチャートはRustコアを使用して、解像度に基づいて画面に表示する必要があるものだけを計算します。また、パン、ズーム、ホバー、および選択によって正確な元の行を返すことができます。このライブラリは、10,000,000,000ポイントのデータセットであるOpenStreetMapの全体を描画した実績があります。

インストールと基本的な使い方

pip install xy または uv add xy でXYをインストールします。チャートはコンテナとマークから構築されます。任意のシーケンスが機能し、NumPyはオプションです。例:

import xy
chart = xy.line_chart(xy.line([1, 2, 3, 4, 5], [120, 180, 165, 240, 310]))
chart  # ノートブック内でレンダリングされます

同じAPIが大規模データにもスケールします。NumPy配列とdensity=Trueフラグを使用すると、1億ポイントの散布図を作成できます。

パフォーマンス特性

ベンチマーク結果によると、XYのレンダリング時間は4桁にわたって平坦なままです。1万ポイントで0.071秒、1億ポイントで0.081秒です。この平坦さは、20万行を超えるとXYが1行につき1つのマーカーを描画する代わりに、画面に限定された密度サーフェスを描画し、ズームすると正確な行にドリルダウンすることによって実現されます。正確なマーカーパス(density=False)は線形にスケールし、1億ポイントで1.34秒に達します。MatplotlibとPlotlyの比較タイミングは急増し、Matplotlibは300万ポイント付近で1秒を超え、Plotlyは250万ポイント付近で超えます。

メモリ使用量

XYのPython側の常駐メモリは緩やかに増加します。1万ポイントで0.05 GiB、250万ポイントで0.13 GiB、1億ポイントで2.58 GiBです。正確なマーカーのベースライン(density=False)は、約2倍のメモリを使用します(1億ポイントで5.26 GiB)。MatplotlibとPlotlyは、同等のサイズでより多くのメモリを消費し、5000万ポイントでそれぞれ3.85 GiBおよび測定不能に達します。

XYの内部動作

XYは、ColumnStoreに正規のf64データを保持します。ネイティブのRust計算ステップが、可視ビューポートに基づいて、直接、デシメーション(間引き)、または密度の表現を生成します。ブラウザに送信されるペイロードは、コンパクトなJSONスペックと型付きバイナリバッファです。ブラウザはWebGL2マーク、Canvas軸、およびDOMインターフェースをレンダリングします。元のf64カラムはPythonに残っているため、ホバーや選択のインタラクションで元の行を返すことができます。

Reflexとの統合

reflex-xyアダプターは、JavaScript、iframe、または個別のチャートサービスを使用せずに、任意のXYチャートを通常のReflexコンポーネントに変換します。pip install reflex-xy または uv add reflex-xy でインストールしてください。rxconfig.pyでアダプターを一度登録します:

import reflex as rx
import reflex_xy
config = rx.Config(app_name="dashboard", plugins=[reflex_xy.XYPlugin()])

次にチャートを埋め込みます:

import reflex as rx
import reflex_xy
import xy
signups = xy.line_chart(xy.line([1, 2, 3, 4, 5], [120, 180, 165, 240, 310]), title="Weekly signups")
def index() -> rx.Component:
    return rx.card(rx.heading("Growth"), reflex_xy.chart(signups, height="320px", width="100%"))

ホバー、パン、ズームは引き続き機能します。Reflexの状態、イベント、またはライブストリームによって駆動されるチャートは、統合ガイドに従ってサポートされています。

実世界の例

リポジトリでは、公開ソースからデータを取得して多様なデータセットを可視化するノートブックを提供しています:

  • Gaia DR3 HR図 (25万個の星)
  • gnomAD v4.1 アレル頻度 (16.4万個の変異)
  • Pan-UKBB Manhattanプロット (81.4万個の変異)
  • Dukascopy EUR/USDティック (10.1万ティック)
  • LIGO GW150914 ストレイン (16,777,216個の生サンプル、3,441個を表示)
  • NYC TLC タクシー乗車密度 (30万件のレコード)
  • OpenStreetMapの例 (10,000,000,000個のノード) をローカルで 各ノートブックはさらにスケールし、ソースの説明とワークロード制御が含まれています。

ロードマップと今後の作業

計画されている機能(順不同)には以下が含まれます:

  • カテゴリカル分布: strip, swarm, beeswarm, boxen, rug
  • 回帰診断: trendline, residual, QQ, PP
  • 散布図行列とジョイントプロット: SPLOM, pair grid, marginal histograms
  • 円グラフ / ドーナツグラフ (xy.pyplotから昇格)
  • ローソク足 / OHLCおよび金融オーバーレイ: SMA, VWAP, Bollinger, RSI, MACD
  • ウォーターフォールおよびファンネル
  • ツリーマップ、サンバースト、およびアイシクル
  • レーダー / 極座標およびゲージ (極座標軸が必要)
  • スロープ、バンプ、およびダンベル
  • 3Dおよびボリューム: scatter, surfaces, meshes, isosurfaces, volumetric views 完全な優先順位付きバックログは、チャートロードマップにあります。

コミュニティの反応 (Hacker News)

コメント投稿者は、Rust/Tailwindの組み合わせとプロジェクトへの熱意を強調しています:

  • "素晴らしい、RustとTailwind CSSという私の大好きなものが2つも一つにまとまっている。" — @farhan99

  • "何世紀もの間matplotlibで行き詰まっていた、アカデミアはこのような変化を好むだろう" — @NickyHeC

  • "これはすごい、簡単に標準ライブラリになると予想できる。3Dとボリュームの可視化が待ちきれない。" — @HoneySpoons 一般的なダッシュボードに対するGPU加速の必要性に疑問を呈する者もいました:

  • "GPU加速がほとんどのチャートのユースケースにおいて意味のある利点になるとは確信が持てない。ほとんどのダッシュボードは、それが重要になるほど多くのデータをレンダリングしていない。チャートがレンダリングのボトルネックになるほど高密度になった時点で、通常はすでに意味をなさないほど混雑している。ズームは大規模なデータセットのサポートを正当化できるが、サンプリング/ビューポートの切り捨てや詳細度(LOD)によって、不要なポイントの描画は回避されることが多い..." — @kasts 欠落している機能や比較について尋ねる者もいました:

  • "ネイティブGUIのサポートは?" — @cozzyd

  • "興味深い。例はdatashaderと比較してどうですか?" — @ahns

  • "evilchartsと比較してどうですか?私の主なユースケースはデータをフロントエンドにマッピングすることであり、優れたライブラリがたくさんある。" — @kl01 アウトオブコア(out-of-core)レンダリングの可能性に注目した人もいました:

  • "XYを使えばアウトオブコアでデータをレンダリングすることが可能で、OpenStreetMapの全体(これは10,742,674,832個のノードです!)をサブ秒間のパン/ズームでレンダリングできます。オンラインでのホストは少し難しいですが、ローカルで試すことができます。" — @adhami

Sources