XYは大量点を画面解像度で処理するPythonチャート基盤
プロジェクト概要:超高速でカスタマイズ可能な Python チャート。すべてのレイヤーをカスタマイズする Python を使用して、マークや軸からインタラクションやレイアウトに至るまでチャートを制御します。
ひと目でわかる
- これは何?
- reflex-dev/xyは、Web、ノートブック、静的出力を一つのPython APIで扱うアルファ段階のチャートライブラリです。Rust計算コア、ColumnStore、密度描画、Reflex連携を、READMEが報告する測定結果と分けて読みます。
- 誰に向いている?
- XYは、普段のPython可視化から大規模点群まで同じAPIで試したい開発者に向きます。READMEは10kから100M点までの速度とメモリを自分の測定として報告していますが、プロジェクトはアルファ段階で、互換表にも未対応機能があります。
- 商用利用できる?
- できます。Apache-2.0 は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
- 今もメンテナンスされている?
- されています。最後のコミットは 13 日前です。
- 何の言語で書かれている?
- 主に Python です(GitHub の言語統計による)。
回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。
オープンソース詳細解説
Web、ノートブック、静的出力を同じAPIで扱う
XYはWeb、ノートブック、静的エクスポート向けのPythonチャートライブラリです。READMEが示す基本形では、チャート容器へlineのようなmarkを入れ、ノートブックではオブジェクトを表示し、to_html、to_png、to_svgでファイルへ書き出します。NumPyは必須ではなく、任意のシーケンスを入力できると説明されています。毎日の折れ線図を作る入口を残しながら、大量点を扱う時だけ同じ構成を別の描画経路へ渡す考え方です。
この対象範囲は、分析用ノートブックとWebアプリの間で描画コードを分けたくない場合に意味があります。出力先がHTML、PNG、SVG、PDFのどれかであっても、チャート定義、軸、注釈、相互作用を一つのPython側モデルで組み立てます。ただし、READMEは各出力形式の細部、フォント差、印刷時の改ページ、画像埋め込み条件を網羅していません。静的出力を納品物にするなら、画面表示が正しいことと、保存ファイルが正しいことを別の確認項目にする必要があります。
大量点で変わるのは描画経路
小さなチャートでは、各点をブラウザへ送るとREADMEは説明します。大きなチャートではRustコアが画面の解像度を基準に、現在の表示範囲に必要な情報だけを計算します。パン、ズーム、ホバー、選択で表示範囲が変わると同じ計算が新しい範囲に対して行われ、選択結果は元の行を返す設計です。概要を密度面として描き、拡大した範囲で正確な点へ戻すという、集約と詳細を同じデータから切り替える構造です。
READMEの説明では、Python側の正確なf64データは保持され、ブラウザへ送るペイロードは画面に合わせて小さくなります。ColumnStoreが元データを保ち、Rustのネイティブ計算が直接描画、間引き、密度描画の経路を選び、WebGL2のmark、Canvasの軸、DOMの操作面へ渡します。これは単なるサンプリングとして読まない方がよいでしょう。密度表示を見ている時と正確な点を選択した時で、返される情報の粒度が異なるからです。データ選択の意味が重要な分析では、密度面の値と元行の対応を試験します。
READMEはOpenStreetMapの100億点データセット全体を描画した例も挙げています。この数字はプロジェクト側の説明であり、利用者のGPU、CPU、ブラウザ、データ分布で同じ結果が再現される保証ではありません。特に高密度領域では画面上の一画素へ多数の行が重なるため、点の存在を確認する画面と、個別行を取得する選択操作を分けて評価します。
mark、guide、操作、配置を細かく指定する
カスタマイズ対象は四つの層に分かれます。markでは色、サイズ、不透明度、記号、グラデーション、線、曲線、カラーマップを指定します。guideでは軸、目盛、格子、注釈、凡例、カラーバー、ツールチップを調整します。interactionではパン、ズーム、ホバー、選択、十字線、callback、連動チャートを扱い、layoutではlayer、facet、応答寸法、themeを組み立てます。チャートの見た目だけでなく、利用者がどの範囲を調べるかまでPythonから定義する構成です。
CSSとTailwindを使える点も、アプリ組み込み時の境界を明確にします。READMEの例では、チャート全体へclass_nameを渡し、tooltipなどの部分へclass_namesを渡します。これにより、描画エンジンの設定とWeb画面の外観を同じPythonコードから管理できます。実際のCSS優先順位、テーマの継承、レスポンシブ寸法の最小値は、style guideとcapability matrixへ戻って確認する対象です。READMEの数行だけで全機能の互換性を推定しません。
matplotlib利用者には、xy.pyplotという名前空間が用意されています。READMEはimportを変え、pyplotの慣用的なfig、ax、plot、legend、showを継続する例を載せています。ただし互換ガイドは、全てのチャート種類と機能が対応済みではないと明記しています。既存コードを移行する場合、import変更だけで終わる経路と、XY固有の宣言的APIへ書き換える経路を分け、軸、凡例、選択、保存の結果を比較します。
10kから100M点までの報告値をどう読むか
READMEのベンチマークは、10kから100M点のライブ対話型チャートを実ブラウザで測る方法を説明しています。各ライブラリへ全行を渡し、それぞれの入力経路を通します。植え込んだsentinel点が点灯してキャンバスが正しいこと、同一フレームが10回続いて安定したことを確認してから時計を止めます。段階描画の最後のchunkまで時間へ含めるため、単純な初回表示だけの計測ではありません。
XYについてREADMEは、10kで0.071秒、100Mで0.081秒という値を報告しています。20万行を超えると画面で必要な密度面を描くため、点数が四桁増えても時間がほぼ一定になるという説明です。density=Falseでは、同じエンジンが100M個の正確なmarkを1.34秒、5.26GiBで描くとされます。比較表ではMatplotlibが50Mで13.385秒、Plotlyが25Mで9.794秒とされ、両者の一部の規模は未完了と記載されています。
メモリ表では、XYのPython側常駐メモリが100M点で2.58GiB、density=Falseでは5.26GiBです。ブラウザのメモリは別計測で、ヘッドレスChromeだけで約1GiBを使うため除外されています。READMEはApple M5 Pro上の単一実行であることと、方法論および生データはrunbookを参照することを示しています。従って、この数字を一般環境の性能保証ではなく、同じ条件下での設計仮説として扱い、自分のブラウザとデータ分布で再計測します。
Reflex統合が追加する利用経路
xyにはReflex用の統合が同梱され、任意のXYチャートを通常のReflexコンポーネントへ変換できます。READMEはJavaScript、iframe、別チャートサービスを用意せず、Reflexのコンポーネントツリー内へ配置できると説明します。導入はxy[reflex]のextra、名前空間はreflex_xyです。rxconfig.pyへreflex_xy.XYPlugin()を登録し、reflex_xy.chart(signups, height="320px")のように画面へ加えます。
Reflex側の状態でチャートを更新する場合は、統合ガイドと実行可能なサンプルを参照します。READMEはカード内の例でホバー、パン、ズームが維持されると述べていますが、状態更新の頻度、再描画時のデータ送信量、ブラウザ側メモリ、選択callbackの型までは短い例で分かりません。静的なチャートと状態駆動のチャートを分け、初回表示、条件変更、範囲変更、選択結果の受け渡しを測定するべきです。
Reflexを既存アプリへ入れる時は、Python処理、Rust計算、ブラウザ描画、Reflex状態更新の境界を記録します。大規模点群でXYが送るのは画面に必要なデータだとしても、アプリ側が毎回全データを再生成すれば、描画以外の場所が律速になる可能性があります。これはREADMEの結果からの推測なので、実装する画面で通信量と更新時間を測って確かめます。
アルファ段階と未対応領域
XYはREADME上でalphaと明記され、頻繁に機能強化されている段階です。ロードマップにはカテゴリ分布、回帰診断、散布図行列と結合図、円とドーナツ、ローソク足とOHLC、金融重ね合わせ、waterfall、funnel、treemap、sunburst、gauge、slope、bump、dumbbell、3Dとvolumeなどが予定項目として並びます。日付は示されていないため、ロードマップを提供時期の約束として扱う根拠はありません。
互換ガイドとcapability matrixは、現在のAPIで何が指定できるかを確認する入口です。matplotlibのコードが動くこと、WebGL2で大量点が描けること、Reflexへ置けることは別々の主張です。必要なチャート種別がロードマップ側にある場合は、対応済みと仮定せず、issueや実装を確認してから選定します。alpha版ではAPI、描画結果、依存関係が変更される可能性を前提に、固定版を保存し、更新前後の画像と選択結果を比較できる記録を作ります。
リポジトリの取得メタデータでは、ライセンスはApache License 2.0、既定ブランチはmain、直近のリリースはv0.0.7です。Apache 2.0は著作権と特許に関する許諾を含みますが、サポートや性能保証を提供するものではありません。READMEが報告する速度、OpenStreetMapの描画、Reflex統合を、ライセンス条件や将来の維持方針と混同しないようにします。
採用前の再現試験を小さく設計する
評価を始めるなら、まずline、scatter、densityの三つを同じ入力で作り、HTML、PNG、SVG、PDFの出力を保存します。小規模データでは全点表示、大規模データでは密度表示を選び、ズーム前後の見た目、ホバーの値、選択時に返る元行、軸と凡例を確認します。sentinel点を既知の位置へ入れ、画面へ現れることだけでなく、選択結果の行識別子が元データと一致することを確認します。
次にデータ点数を10k、100k、1M、10Mのように段階化し、描画時間、Python側メモリ、ブラウザ側メモリ、通信量、操作応答を分けて測ります。READMEの報告値は一台のApple M5 Proでの結果なので、実際のCPU、GPU、ブラウザ、画面解像度、データ型を固定して比較します。density=Falseを使う経路では正確な全点転送が起きるため、密度描画との違いを時間だけでなく、視覚的な情報量と選択精度でも評価します。
Reflexを使う場合は、状態更新でチャートを再生成する時と、表示範囲だけを変える時を分けます。matplotlibからの移行では、未対応のplot機能を洗い出し、軸、注釈、tooltip、callback、保存結果を基準画像と比較します。XYはアルファ段階なので、採用版、capability matrix、ベンチマーク条件、失敗した操作、代替実装を記録し、READMEの自称値を自分の本番性能へ置き換えないことが判断の前提になります。
本番候補として記録する項目には、入力形式、点数、欠損値、座標範囲、画面解像度、ブラウザ版、CPUとGPU、Python側メモリ、ブラウザ側メモリ、描画完了条件を含めます。密度表示では集約された画素と元行の関係を確認し、ホバーや選択で正確な行が返るかを検証します。特定の点が密集するデータでは、単一markの重なりと密度面の色表現を比較し、分析上必要な外れ値が失われていないかを調べます。
API移行時は、matplotlibの既存コードを一度に全て変更せず、折れ線、散布図、注釈、凡例、保存の順に分けます。各段階で基準画像、生成ファイル、操作結果、警告、未対応機能を残します。Reflexへ埋め込む場合は、コンポーネント生成、状態変更、選択callback、通信、ブラウザ描画を別計測し、XY自身のRust処理時間とWebアプリ全体の応答時間を混同しません。
この手順であれば、XYの強みである画面解像度に応じた大量点処理を、用途に即した精度と操作性の観点から評価できます。READMEのベンチマークは有力な設計材料ですが、alpha段階のライブラリに対して、未対応チャート、変更されるAPI、単一機種での速度値、出力形式ごとの品質を別々に確認することが必要です。採用範囲は検証済みのチャートと出力に限定し、ロードマップや自称速度を将来保証として扱いません。
実験の終了条件も先に定めます。十回同一フレームが続くこと、植込点が全て検出できること、選択行の識別子が一致すること、保存物を再読込できることを各出力で確認します。点数を増やしてもPython入力、Rust計算、ブラウザ転送、表示処理のどこが増えたか分からなければ、単一の秒数は判断材料になりません。比較対象のMatplotlibやPlotlyも同じ入力経路と画面条件で測り、XYの結果だけを抜き出して一般性能と呼ばないようにします。
選定時には、必要な可視化の種類、最大点数、許容遅延、選択精度、静的出力の品質、Reflexの状態連携を要件表へ書きます。対応済みのAPI、未対応の機能、測定値、推測、将来計画を欄分けすれば、XYが得意とする大規模密度描画と、まだ確認できない機能を同じ評価に混ぜずに済みます。
版固定と結果保存を行い、次回更新時に描画差分、操作差分、メモリ差分を比較します。
測定条件と失敗条件を明記し、単一実行の報告値を自環境の保証へ変換しません。
未確認事項は未確認として残します。
採用前後の比較結果を保存し、変更履歴を追跡します。 実測値を確認します。
編集部の結論
XYは、普段のPython可視化から大規模点群まで同じAPIで試したい開発者に向きます。READMEは10kから100M点までの速度とメモリを自分の測定として報告していますが、プロジェクトはアルファ段階で、互換表にも未対応機能があります。採用前に自分のブラウザ、データ型、選択操作、出力形式、Reflex画面で再測定してください。
コミュニティノート