PowerShellでも、GUIやグラフを自在に扱えることをご存じでしょうか?
この記事では、PowerShell 5.x で JSON データを読み込み、カテゴリごとの件数を WPFウィンドウ上に円グラフ で可視化する方法を紹介します。
🎯 ゴール
- JSONファイルを読み込む
- カテゴリごとの件数を集計
- ダークテーマのWPFウィンドウに円グラフで表示
🗂 構成
C:\myTool\JsonPieChart\ ├─ Show-PieChart.ps1 └─ ChartWindow.xaml
🧩 JSONサンプル (data.json)
[
{"Category": "A", "Value": 10},
{"Category": "B", "Value": 20},
{"Category": "A", "Value": 30},
{"Category": "C", "Value": 15},
{"Category": "B", "Value": 25}
]
🪶 ChartWindow.xaml
WPFのレイアウト定義ファイルです。
WindowsFormsHostを使って、.NETのChartコントロールをWPF上に埋め込みます。
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
Title="JSONデータ件数 - 円グラフ" Height="400" Width="600"
Background="#1E1E1E" WindowStartupLocation="CenterScreen">
<Grid Margin="10">
<wfi:WindowsFormsHost Name="ChartHost"/>
</Grid>
</Window>
💻 Show-PieChart.ps1
# Requires -Version 5.1
Add-Type -AssemblyName PresentationCore, PresentationFramework, WindowsBase
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Windows.Forms.DataVisualization
# ===== XAML 読み込み =====
[xml]$xaml = Get-Content -Path "C:\myTool\JsonPieChart\ChartWindow.xaml" -Raw
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)
# ===== コントロール参照 =====
$chartHost = $window.FindName("ChartHost")
# ===== JSON 読み込み =====
$jsonPath = "C:\myTool\JsonPieChart\data.json"
$data = Get-Content $jsonPath -Raw | ConvertFrom-Json
# ===== 件数集計 =====
$grouped = $data | Group-Object -Property Category | Select-Object Name,Count
# ===== Chart 構築 =====
$chart = New-Object System.Windows.Forms.DataVisualization.Charting.Chart
$chart.BackColor = [System.Drawing.Color]::FromArgb(30,30,30)
$chart.ForeColor = [System.Drawing.Color]::White
$chart.Width = 560
$chart.Height = 340
$chartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$chartArea.BackColor = [System.Drawing.Color]::FromArgb(45,45,48)
$chartArea.Area3DStyle.Enable3D = $true
$chart.ChartAreas.Add($chartArea)
$series = New-Object System.Windows.Forms.DataVisualization.Charting.Series
$series.ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Pie
$series.IsValueShownAsLabel = $true
$series.LabelForeColor = [System.Drawing.Color]::White
$series.Font = New-Object System.Drawing.Font("Meiryo UI", 10)
foreach ($item in $grouped) {
[void]$series.Points.AddXY($item.Name, $item.Count)
}
$chart.Series.Add($series)
$chart.Legends.Add("Legend1")
# ===== WPF に埋め込み =====
$chartHost.Child = $chart
# ===== 表示 =====
$window.ShowDialog() | Out-Null
▶ 実行方法
PowerShell で以下を実行します。
powershell -ExecutionPolicy Bypass -File "C:\myTool\JsonPieChart\Show-PieChart.ps1"
📊 出力結果
- タイトル:「JSONデータ件数 - 円グラフ」
- 背景はダークグレー、フォントは白
- 各カテゴリごとに件数ラベル付きで可視化
- 3D円グラフで見やすい構成
⚙️ 応用例
🎨 3Dを無効化する
$chartArea.Area3DStyle.Enable3D = $false
💡 合計値で集計する場合
$grouped = $data | Group-Object Category | ForEach-Object {
[PSCustomObject]@{ Name = $_.Name; Count = ($_.Group | Measure-Object Value -Sum).Sum }
}
📎 まとめ
| 要素 | 内容 |
|---|---|
| 使用技術 | PowerShell 5.x + XAML + WPF |
| 外部ライブラリ | 不要(.NET標準のみ) |
| 出力 | 円グラフ(3D対応) |
| 主な用途 | JSONデータの集計可視化、ダッシュボード表示など |
PowerShellでも、ちょっとしたスクリプトとXAMLでダッシュボードのようなUIが簡単に作れます。
業務ツールの軽量可視化や、ログ集計の確認に活用してみてください。