どのようにPython matiplotlibを利用してレーダー図を描きますか?


本記事では、レーダー図をmatplotlibで描くことを紹介します。
レーダー図はネットワーク図、蜘蛛図、星図、蜘蛛網図とも言われています。不規則な多角形です。レーダー図は同じ事物の多次元指標をイメージして示すことができ、レーダー図はほとんど随所に見られ、応用シーンは非常に多い。
一、matplotlibは円形レーダー図を描く。

# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
 
 
results = [{"    ": 87, "    ": 79, "  ": 95, "     ": 92, "    ": 85},
   {"    ": 80, "    ": 90, "  ": 91, "     ": 85, "    ": 88}]
data_length = len(results[0])
#               
angles = np.linspace(0, 2*np.pi, data_length, endpoint=False)
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]
#         
score_a = np.concatenate((score[0], [score[0][0]]))
score_b = np.concatenate((score[1], [score[1][0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))
#        
fig = plt.figure(figsize=(8, 6), dpi=100)
#       
ax = plt.subplot(111, polar=True)
#      
ax.plot(angles, score_a, color='g')
ax.plot(angles, score_b, color='b')
#               
ax.set_thetagrids(angles*180/np.pi, labels)
#       0     
ax.set_theta_zero_location('N')
#             
ax.set_rlim(0, 100)
#              ,           
ax.set_rlabel_position(270)
ax.set_title("       ( )")
plt.legend(["   ", "   "], loc='best')
plt.show()
実行結果:

レーダー図を作るにはまず極座標系を作る必要があります。極座標系については自分で知ることができます。素晴らしい座標を作ったら、極座標に折れ線図、ヒストグラムなどを描画できます。ほとんどの場合、折れ線図を使って不規則な多角形を形成します。本論文ではある大学の一年生の期末試験の成績を例にとってレーダー図の効果を実証している。
linspace():極座標をデータの次元によって等分し、最初のパラメータが開始角度に入ってきて、第二のパラメータが終了角度に入ってきて、第三のパラメータがどれぐらいの等分されてきますか?他のパラメータは、必要に応じて、endpointのように、デフォルトはTrueで、最後のデータは終了の角度にあり、本例では前のパラメータ0〜2πはFalseに設定されるべきである。そうでなければ、最後のデータは最初のデータ角度と重複している。
コンテント():レーダー図のデータをリング状に密封し、コンテント関数の最初のパラメータは一つの母集団であり、元のグループの各要素は一つの配列であり、コンテント関数はこれらの配列を結合して、新しい配列を構成する。描画したレーダー図を閉じて、データの最初の値をデータの最後に接続すればいいです。
本論文では折れ線図plot()を用いてレーダー図を描き、figur関数を用いて図形の大きさとシャープネスを設定し、subplot()関数を用いてサブ図を作成する。subplot()関数の最初のパラメータは3の数字に入ってきます。最初の数字はキャンバスを何行に分けますか?2番目の数字はキャンバスを何列に分けますか?3番目の数字は現在のサブ図がどの位置にあるかを表します。3番目の数字は前の2つの数字のサブ図の範囲を超えてはいけません。111がキャンバスを一列に分割することを示すように、現在のサブ図は最初のサブ図の中にある。subplot()関数では、polarパラメータをTrueに設定し、得られた図形が極座標です。
極座標系の設定が完了したら、サブ図オブジェクトaxを使って折れ線図関数plot()を呼び出し、レーダー図を描画することができます。複数のグループのデータがあれば、plot()関数を複数回呼び出してもいいです。
set_を使うthetagrids関数は、レーダー図の各次元のラベルと表示位置を設定します。set_を使うtheta_ゼロlocation()関数はレーダー図の0度位置を設定し、「N」、「NW」、「W」、「SW」、「S」、「SE」、「E」、「NE」の8つの方向の略語が入る。set_を使うマーム関数は極座標上の目盛範囲を設定します。set_を使うガールバールposition()関数は極座標上の目盛ラベル表示位置を設定し、レーダー図0度に対する角度値を入力します。もちろん、タイトル、凡例など、必要に応じて他の属性を設定することもできます。
上の例では、二人のクラスメートのテスト成績をレーダー図に描いて、レーダー図を通して、二人の単科の成績は互いに優劣があることが分かります。上のレーダー図では、グリッド線は全部円形で、折れ線図で接続されているレーダー図は二つの次元の間で直接接続されているので、グリッド線を多角形に換えるほうが合理的です。
二、matplotlibは多角形レーダー図を描く。

import numpy as np
import matplotlib.pyplot as plt
 
 
results = [{"    ": 87, "    ": 79, "  ": 95, "     ": 92, "    ": 85},
   {"    ": 80, "    ": 90, "  ": 91, "     ": 85, "    ": 88}]
data_length = len(results[0])
angles = np.linspace(0, 2*np.pi, data_length, endpoint=False)
labels = [key for key in results[0].keys()]
score = [[v for v in result.values()] for result in results]
score_a = np.concatenate((score[0], [score[0][0]]))
score_b = np.concatenate((score[1], [score[1][0]]))
angles = np.concatenate((angles, [angles[0]]))
labels = np.concatenate((labels, [labels[0]]))
fig = plt.figure(figsize=(10, 6), dpi=100)
fig.suptitle("       ( )")
ax1 = plt.subplot(121, polar=True)
ax2 = plt.subplot(122, polar=True)
ax, data, name = [ax1, ax2], [score_a, score_b], ["   ", "   "]
for i in range(2):
 for j in np.arange(0, 100+20, 20):
  ax[i].plot(angles, 6*[j], '-.', lw=0.5, color='black')
 for j in range(5):
  ax[i].plot([angles[j], angles[j]], [0, 100], '-.', lw=0.5, color='black')
 ax[i].plot(angles, data[i], color='b')
 #        
 ax[i].spines['polar'].set_visible(False)
 #        
 ax[i].grid(False)
 for a, b in zip(angles, data[i]):
  ax[i].text(a, b+5, '%.00f' % b, ha='center', va='center', fontsize=12, color='b')
 ax[i].set_thetagrids(angles*180/np.pi, labels)
 ax[i].set_theta_zero_location('N')
 ax[i].set_rlim(0, 100)
 ax[i].set_rlabel_position(0)
 ax[i].set_title(name[i])
plt.show()
実行結果:

極座標系では、極径値が等しい点が円になるので、レーダー図ではグリッド線はデフォルトでは円形になります。多角形のレーダー図を描画するには、円形のグリッド線を隠し、目盛範囲に応じて多角形のグリッド線を描画する必要があります。
まず、plot()関数を使用して、目盛範囲に応じて、同心の複数の多角形と複数の次元方向の極軸を描き、レーダー図のメッシュ線として「網」を形成する。
チェーン式呼び出し極座標のspines['polar'].set_visible関数は、パラメータFalseに伝わり、極座標系の最も外周の円を隠します。grid()関数を呼び出してパラメータFalseに着信し、極座標系の円形グリッド線を非表示にします。
グリッド線を変更すると、多角形の効果が得られます。二番目にレーダー図を描画する時、二人のクラスメートの成績を二つのレーダー図に分けて、text()で各次元のデータ表示を設定して、suptitle()関数を使って図形全体のタイトルを設定します。
上の二回の絵は、二人のクラスメートの成績を同じレーダー図に描いた時、二人のクラスメートの成績を比べやすいです。別々に絵を描く時、個人の成績状況を分析しやすいです。円形のレーダー図に対して、多角形のレーダー図では、レーダー図とグリッド線の不合理な交差(レーダー図とグリッド線が二回交差する)が現れないので、多角形グリッド線を使用するのがより合理的である。
ここではPythotomatiplotlibを利用してレーダー図を描く方法について紹介します。Python matiplotlibに関するものがもっと多いです。レーダー図の内容は以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。