Python レーダーチャートとそのデータテーブルを組み合わせたデータ可視化「matplotlib」

'24/08/31更新:レーダーチャートの右横に、その数値データを表形式で載せるコードを追記しました。

 本記事では、Pythonのmatplotlibとpandasライブラリを使って、レーダーチャートとデータテーブルを同時に表示する方法を紹介します。レーダーチャートは、複数の変数を同時に比較できる視覚的に魅力的なグラフであり、特に複数のカテゴリの特性を比較したい場合に有効です。

下図は、上記の元データです。

 

レーダーチャートとデータテーブルを組み合わせる理由

  • 視覚的な魅力: レーダーチャートは、データの全体的な傾向を直感的に捉えやすく、プレゼンテーションなどでも効果的です。
  • 詳細な情報: データテーブルは、各データの具体的な数値を確認できるため、レーダーチャートだけでは分かりにくい部分を補完します。

具体的な活用例

  • ゲームキャラクターのステータス比較: 複数のキャラクターのステータスをレーダーチャートで比較し、それぞれの強みと弱みを可視化できます。
  • 製品の性能比較: 複数の製品の性能をレーダーチャートで比較し、どの製品がどの点で優れているか一目瞭然です。
  • アンケート結果の分析: アンケートの回答結果をレーダーチャートで可視化し、回答者の傾向を把握できます。

■本プログラム

import matplotlib.pyplot as plt
import pandas as pd
from math import pi
import japanize_matplotlib
plt.rcParams['font.size'] = 14

# データの読み込み
file_path = 'sample_data.csv'
df = pd.read_csv(file_path)
df

# カテゴリのリストと角度の計算
categories = list(df['ステータス'])
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]

# プロットの初期化
fig, ax = plt.subplots(1, 2, figsize=(8, 6), subplot_kw=dict(polar=True))

# サブプロットの位置調整
ax[0].set_position([0.05, 0.1, 0.4, 0.8])  # [left, bottom, width, height]
ax[1].set_position([0.45, 0.05, 0.4, 0.8])

# レーダーチャートの作成
ax[0].set_xticks(angles[:-1])
ax[0].set_xticklabels(categories)

# data1
data1_name = '戦士'
data1 = df[data1_name].tolist()
data1 += data1[:1]
ax[0].plot(angles, data1, linewidth=1, linestyle='solid', color='b', label=data1_name)
ax[0].fill(angles, data1, 'b', alpha=0.1)

# data2
data2_name = '武闘家'
data2 = df[data2_name].tolist()
data2 += data2[:1]
ax[0].plot(angles, data2, linewidth=1, linestyle='solid', color='r', label=data2_name)
ax[0].fill(angles, data2, 'r', alpha=0.1)

# 各頂点にデータの数値を表示
for i in range(N):
    # ax[0].text(angles[i], data1[i], str(data1[i]),
    #         horizontalalignment='center', size=12, color='blue', weight='semibold')
    ax[0].text(angles[i], data2[i], str(data2[i]),
            horizontalalignment='center', size=12, color='red', weight='semibold')

# 目盛の数値表記を消す
ax[0].set_yticklabels([])

# 凡例の追加
ax[0].legend(loc='upper right', bbox_to_anchor=(1.45, 1.0), fontsize=14)

# データ表の挿入
ax[1].axis('off')
table = ax[1].table(cellText=df.values, colLabels=df.columns, cellLoc='center', loc='center')
table.auto_set_font_size(False)
table.set_fontsize(11)
table.scale(1.5, 1.5)

# 表の幅の余白をなくす
table.auto_set_column_width([0, 1, 2])

# タイトル
#plt.title(f'{data1_name} vs {data2_name} ステータス比較', pad=35, loc='right')

# グラフの表示
plt.show()

 

(参考)下図のようにレーダーチャートのみの場合の雛形コードも載せます。

import matplotlib.pyplot as plt
import pandas as pd
from math import pi
import japanize_matplotlib
plt.rcParams['font.size'] = 14

# データ読み込み
file_path = 'sample_data.csv'
df = pd.read_csv(file_path)
df

# カテゴリのリストと角度の計算
categories = list(df['ステータス'])
N = len(categories)
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]

# プロットの初期化
ax = plt.subplot(111, polar=True)

# 各軸のラベルを追加
plt.xticks(angles[:-1], categories)

# data1
data1_name = '戦士'
data1 = df[data1_name].tolist()
data1 += data1[:1]
ax.plot(angles, data1, linewidth=1, linestyle='solid', color='b', label=data1_name)
ax.fill(angles, data1, 'b', alpha=0.1)

# data2
data2_name = '武闘家'
data2 = df[data2_name].tolist()
data2 += data2[:1]
ax.plot(angles, data2, linewidth=1, linestyle='solid', color='r', label=data2_name)
ax.fill(angles, data2, 'r', alpha=0.1)

# 各頂点にデータの数値を表示
for i in range(N):
    # ax.text(angles[i], data1[i], str(data1[i]),
    #         horizontalalignment='center', size=12, color='blue', weight='semibold')
    ax.text(angles[i], data2[i], str(data2[i]),
            horizontalalignment='center', size=12, color='red', weight='semibold')

# 目盛の数値表記を消す
ax.set_yticklabels([])

# 凡例の追加
plt.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))

# タイトル
plt.title(f'{data1_name} vs {data2_name} ステータス比較', pad=25)

# グラフの表示
plt.show()

以上

<広告>