'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])
ax[1].set_position([0.45, 0.05, 0.4, 0.8])
ax[0].set_xticks(angles[:-1])
ax[0].set_xticklabels(categories)
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_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], 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.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_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_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], 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()
以上
<広告>
リンク
リンク