PyGWalker と PySide6 (Qt 6) で構築した、オープンソースの Tableau 風データ可視化デスクトップアプリケーション。
CSV、Excel、Parquet ファイルを読み込み、ドラッグ&ドロップで直感的にグラフを作成・分析できます。
- Graphic Walker - ドラッグ&ドロップで簡単にグラフ作成
- Tableau のような直感的なインターフェース
- 複数の選択肢から最適なグラフを自動提案
- kernel_computation モード - DuckDB による超高速集計
- 大規模データセット(GB 単位)にも対応
- クライアント側とサーバー側の計算を自動切り替え
- データはコンピュータ内で処理(クラウド不要)
- オフライン完全対応
- プライバシーを最優先
- ライト / ダーク / システム自動 のテーマ切替
- ズーム機能
- 最近開いたファイル履歴
- 完全日本語化
- CSV / TSV - カンマ区切り・タブ区切りテキスト
- Excel - .xlsx / .xls ファイル
- Parquet - 高効率カラムナーフォーマット
- Python 3.10 以上
- Windows / macOS / Linux
- 🪟 Windows 環境ガイド - Windows 10/11 での詳細手順
- 🍎 macOS - Coming soon
- 🐧 Linux - Coming soon
# リポジトリをクローン
git clone https://github.com/Utakata/pygwalker-desktop.git
cd pygwalker-desktop
# 開発モードでインストール
pip install -e .pygwalker>=0.5.0.0 # グラフィック・ウォーカー エンジン
PySide6>=6.8.0 # Qt 6 Python バインディング
pandas>=2.0.0 # DataFrameライブラリ
openpyxl>=3.1.0 # Excel 読み込み
pyarrow>=14.0.0 # Parquet 読み込み
すべての依存パッケージは pip install -e . で自動的にインストールされます。
# コマンドラインから
python -m pygwalker_desktop
# または
pygwalker-desktop- ファイルを開く -
ファイル > 開くから CSV / Excel / Parquet ファイルを選択 - フィールドを配置 - 左パネルからフィールドをドラッグして行・列・色などに配置
- グラフを作成 - 自動的にグラフが更新されます
- さらに詳細に - フィルタ、並べ替え、集計関数を追加
- エクスポート - グラフを PNG / SVG で保存
- 開く (Ctrl+O) - CSV / Excel / Parquet ファイルを開く
- 最近開いたファイル - 過去 10 個のファイルからワンクリックで開く
- 設定をエクスポート - グラフ設定を JSON で保存(今後のアップデートで対応)
- 設定をインポート - 以前保存した設定を読み込む(今後のアップデートで対応)
- 終了 (Ctrl+Q) - アプリケーションを閉じる
- ライト / ダーク / システム - テーマ切替
- 拡大 (Ctrl++) - ズインイン
- 縮小 (Ctrl+-) - ズームアウト
- ズームリセット (Ctrl+0) - 100% に戻す
- このアプリについて - バージョン情報とクレジット
- ファイルを開く - ファイルダイアログを表示
- ライト / ダーク / 自動 - テーマの素早い切替
ファイル名、行数 × 列数、データ処理モード(kernel_computation の有無)を表示
┌─────────────────────────────────────────┐
│ MainWindow (PySide6) │
│ ┌─────────────────────────────────┐ │
│ │ メニューバー / ツールバー │ │
│ ├─────────────────────────────────┤ │
│ │ │ │
│ │ QWebEngineView │ │
│ │ (Graphic Walker UI) │ │
│ │ ← http://127.0.0.1:{port} → │ │
│ │ │ │
│ ├─────────────────────────────────┤ │
│ │ ステータスバー │ │
│ └─────────────────────────────────┘ │
└──────────────┬──────────────────────────┘
│ HTTP GET/POST
▼
┌─────────────────────────────────────────┐
│ ServerBridge (QThread) │
│ - PygWalker インスタンス │
│ - HTTPServer (127.0.0.1:{free_port}) │
│ - GET / → PyGWalker HTML │
│ - POST /comm → DuckDB クエリ → JSON │
└─────────────────────────────────────────┘
問題点:setHtml() による直接埋め込み
- Chromium は HTML に 2MB の制限がある
- PyGWalker の生成 HTML は 2.8MB に達する
- ✗ 実装不可能
解決策:ローカル HTTP サーバー
- サーバーから HTML をストリーミング配信
- 大容量データにも対応
- ✓ kernel_computation (DuckDB) も完全サポート
メイン UI スレッド
- Qt イベントループ実行
- QWebEngineView レンダリング
- ユーザーインタラクション
サーバー スレッド (ServerBridge)
- HTTP リクエスト処理
- PyGWalker インスタンス管理
- DuckDB クエリ実行
- UI ブロッキングなし
PyGWalker webserver.py パターンを正しく再現:
walker._get_props("web_server") # 設定プロパティ取得
walker._get_render_iframe(props) # HTML 生成
walker._init_callback(comm) # /comm エンドポイント登録
walker.comm._receive_msg(...) # DuckDB クエリ処理pygwalker-desktop/
├── README.md # このファイル
├── pyproject.toml # プロジェクト設定 (依存パッケージ他)
├── .gitignore # Git 除外ファイル
├── sample_data.csv # テスト用サンプルデータ
│
├── src/pygwalker_desktop/
│ ├── __init__.py # パッケージ初期化
│ ├── __main__.py # python -m pygwalker_desktop エントリポイント
│ │
│ ├── app.py # QApplication ブートストラップ
│ │ └── main() エントリポイント
│ │
│ ├── main_window.py # QMainWindow メイン画面
│ │ ├── メニューバー (ファイル / 表示 / ヘルプ)
│ │ ├── ツールバー
│ │ ├── ステータスバー
│ │ ├── ファイルダイアログ
│ │ ├── 最近開いたファイル管理
│ │ └── テーマ切替
│ │
│ ├── web_view.py # QWebEngineView ラッパー
│ │ └── JS / LocalStorage 設定
│ │
│ ├── server/
│ │ ├── __init__.py
│ │ ├── handler.py # HTTP リクエストハンドラ
│ │ │ ├── do_GET() → PyGWalker HTML 提供
│ │ │ ├── do_POST(/comm) → DuckDB クエリ処理
│ │ │ └── do_GET(/health) → ヘルスチェック
│ │ │
│ │ └── bridge.py # ServerBridge (QThread)
│ │ ├── PygWalker インスタンス生成
│ │ ├── HTTPServer 起動・停止
│ │ └── スレッドセーフなシャットダウン
│ │
│ ├── data/
│ │ ├── __init__.py
│ │ └── loader.py # ファイル読み込み
│ │ ├── CSV / TSV 対応
│ │ ├── Excel 対応
│ │ └── Parquet 対応
│ │
│ └── widgets/
│ ├── __init__.py
│ └── settings_dialog.py # 設定ダイアログ
│ ├── 外観 (ライト / ダーク / システム)
│ ├── チャートテーマ (g2 / vega)
│ └── デフォルトタブ (可視化 / データ)
│
└── tests/
└── __init__.py # テスト (今後拡充予定)
| 技術 | バージョン | 用途 |
|---|---|---|
| Python | 3.10+ | 実装言語 |
| PyGWalker | 0.5.0+ | グラフ・ウォーカー エンジン |
| PySide6 | 6.8.0+ | Qt 6 バインディング |
| pandas | 2.0.0+ | DataFrame 処理 |
| DuckDB | 1.5.1+ | サーバーサイド集計 |
| Chromium (埋め込み) | 最新 | レンダリング エンジン |
| 項目 | 推奨値 |
|---|---|
| 最大行数 (kernel_computation OFF) | 100,000 |
| 最大行数 (kernel_computation ON) | 100,000,000 (100M) |
| 最大列数 | 1,000 |
| HTML バンドルサイズ | 2.8 MB |
注: kernel_computation は 1GB 以上のデータセットで自動的に有効になります。
| スレッド | 役割 | 通信 |
|---|---|---|
| メイン (Qt イベントループ) | UI レンダリング、ユーザー入力 | Qt Signals/Slots |
| サーバー (QThread) | HTTP サーバー、PyGWalker、DuckDB | Signal/Slot, HTTP |
| ファイル読み込み (QThread) | 大容量ファイル読み込み | Signal/Slot |
以下の設定は自動的に保存・復元されます:
| 設定項目 | デフォルト | 用途 |
|---|---|---|
appearance |
media | テーマ (media/light/dark) |
theme_key |
g2 | チャートテーマ (g2/vega) |
default_tab |
vis | デフォルトタブ (vis/data) |
last_open_dir |
(ホームディレクトリ) | 前回開いたディレクトリ |
recent_files |
(空) | 最近開いたファイル (最大 10 件) |
window_geometry |
(デフォルト) | ウィンドウサイズ・位置 |
ファイル > 設定 (今後のメニューに追加予定) で以下を変更可能:
- 外観 - ライト / ダーク / システム自動
- チャートテーマ - g2 / vega
- デフォルトタブ - 可視化 / データ
- CSV / TSV 対応
- Excel 対応
- Parquet 対応
- 大容量ファイル読み込み時のプログレスダイアログ
- ライト / ダーク / システムテーマ
- ズーム機能
- ステータスバー情報
- 設定ダイアログ
- キーボードショートカット追加
- グラフ設定の JSON エクスポート
- グラフ設定の JSON インポート
- データセットごとの設定自動保存
- SQLクエリエディタ (kernel_computation 用)
- 複数データセットの結合
- カスタム計算フィールド
- 地図ビジュアライゼーション
- PyInstaller でスタンドアロン EXE 化
- macOS アプリバンドル (.app)
- Linux AppImage 作成
| 資料 | 内容 |
|---|---|
| WINDOWS_GUIDE.md | Windows 10/11 での詳細なインストール・利用ガイド |
| QUICKSTART.md | 5 分で始められるクイックスタート |
| ARCHITECTURE.md | システム設計・技術仕様書 |
# 仮想環境作成
python -m venv venv
# 仮想環境有効化
# Windows:
venv\Scripts\activate
# macOS / Linux:
source venv/bin/activate
# 開発モードでインストール
pip install -e .
# アプリ起動
python -m pygwalker_desktop- フォーマッター: 未設定 (今後: black / autopep8)
- Linter: 未設定 (今後: flake8 / pylint)
- 型チェック: 未設定 (今後: mypy)
pytest tests/# パッケージが正しくインストールされていません
pip install -e .- 原因: PyGWalker HTML 生成に失敗している
- 解決: コンソール出力を確認し、エラーメッセージを確認してください
- 原因: kernel_computation (DuckDB) でメモリに全データをロード
- 解決:
- ファイルサイズを小さくする
- Parquet 形式を使用(より効率的)
- フィルタを事前に適用
- 原因: フィールド配置が正しくない、またはデータ型エラー
- 解決:
- 左パネルのフィールドリストを確認
- 行・列・色などが正しく配置されているか確認
- データが NULL / 空でないか確認
本プロジェクトは Apache License 2.0 の下で公開されています。
詳細は LICENSE ファイルを参照してください。
- PyGWalker: Apache License 2.0
- PySide6: LGPL
- pandas: BSD 3-Clause
- DuckDB: MIT (PyGWalker の依存)
プルリクエストを歓迎します!
- このリポジトリをフォーク
- 機能ブランチを作成 (
git checkout -b feature/amazing-feature) - コミット (
git commit -m 'feat: amazing feature') - ブランチをプッシュ (
git push origin feature/amazing-feature) - プルリクエストを作成
- PyGWalker: Kanaries - Graphic Walker エンジン
- PySide6: Qt for Python - Qt 6 Python バインディング
- pandas: pandas development team
問題が発生した場合は、GitHub Issues で報告してください。
Made with ❤️ using PyGWalker and PySide6