背景
エクセルではレーダーチャートにエラーバーを含めることができません。
この記事では、エラーバー付きのレーダーチャートをpython(matplotlib)で描画する方法を紹介します。
動作環境
- Windows11
- Ubuntu 22.04.3 LTS (WSL2)
(Google Colabでも動作することを確認しています)
サンプルコード
エラーバー付きレーダープロットを描画
このプログラムにより、レーダープロットの各頂点にエラーバーを持ったグラフを作成できます。
実際にこのコードを使用する場合は、手持ちのデータを「label_list, value_list, error_list」に入れてプログラムを実行しましょう。目盛りの値など、パラメータを調整したい場合は、「#パラメータの指定」以下の値から変更できます。パラメータとレーダーチャートの対応は図中に示しています。
import matplotlib.pyplot as plt
import numpy as np
#ラベル、プロットする値、エラーバーを入力
label_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
value_list = [0.90, 0.85, 0.75, 0.80, 0.95, 0.70, 0.85, 0.88]
error_list = [0.09, 0.1, 0.05, 0.20, 0.02, 0.020, 0.045, 0.1]
line_color = "blue"
#パラメータの指定
#リスト先頭の値のレーダープロット上の位置( "N", "NW", "W", "SW", "S", "SE", "E", "NE")
#Eだと、先頭の値が一番右(東)になる
theta_zero_location = "E"
#目盛りを入力
rgrids = [0, 0.25, 0.50, 0.75, 1]
#目盛り位置の角度
rgrids_angle = 75
#外枠の描画位置を入力
border_value = 1.05
#レーダーチャート中心の値を入力
center_value = 0
###################################################################################
#レーダーチャートの始点と終点をつなげるために、各リストの最後に最初の値を入れる
angle_list = [n / float(len(label_list)) * 2 * np.pi for n in range(len(label_list))]
angle_list.append(angle_list[0])
value_list.append(value_list[0])
error_list.append(error_list[0])
# レーダーチャートのフォーマットを作成
fig, ax = plt.subplots(1, 1, subplot_kw=dict(projection='polar'))
ax.set_rgrids([]) #目盛り線を削除
ax.spines['polar'].set_visible(False) #外枠線を削除
for grid_value in rgrids:
grid_values = [grid_value] * (len(label_list)+1)
ax.plot(angle_list, grid_values, '--',color="gray", linewidth=0.5) #目盛り線を再描画
ax.plot(angle_list, [border_value] * (len(label_list)+1), '-',color="k", linewidth=1) #外枠線を再描画
for t in rgrids:
ax.text(x=np.pi * (rgrids_angle/180), y=t, s=t)
ax.set_rlim([center_value, border_value])
# レーダーチャートにプロット
ax.errorbar(angle_list, value_list, error_list,fmt='-o', linewidth=1, capsize=5,c=line_color)
ax.set_xticks(angle_list[:-1],label_list )
ax.set_theta_zero_location(theta_zero_location)
(おまけ)描画形式の変更
上記プログラムの「#レーダーチャートにプロット」を以下のように書き換えることで、エラーバーではない形式で誤差範囲を示すことができます。
# レーダーチャートにプロット
top_value_list = [acc+ye for acc,ye in zip(value_list,error_list)]
bottom_value_list = [acc-ye for acc,ye in zip(value_list,error_list)]
ax.plot(angle_list, value_list, linewidth=1, linestyle='-',c=line_color)
ax.plot(angle_list, top_value_list, linewidth=0.5, linestyle='-',c='grey')
ax.plot(angle_list, bottom_value_list, linewidth=0.5, linestyle='-',c='grey')
ax.fill_between(angle_list,top_value_list,color=line_color,alpha=0.1)
ax.fill_between(angle_list,bottom_value_list,color='w')
ax.set_xticks(angle_list[:-1],label_list )
ax.set_theta_zero_location(theta_zero_location)
参考文献