<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python matplotlib繪制雷達圖

          共 4345字,需瀏覽 9分鐘

           ·

          2021-01-07 19:03



          本篇文章介紹使用matplotlib繪制雷達圖。


          雷達圖也被稱為網(wǎng)絡(luò)圖,蜘蛛圖,星圖,蜘蛛網(wǎng)圖,是一個不規(guī)則的多邊形。雷達圖可以形象地展示相同事物的多維指標,應(yīng)用場景非常多。


          一、matplotlib繪制圓形雷達圖


          # coding=utf-8import numpy as npimport matplotlib.pyplot as plt

          results = [{"大學(xué)英語": 87, "高等數(shù)學(xué)": 79, "體育": 95, "計算機基礎(chǔ)": 92, "程序設(shè)計": 85}, {"大學(xué)英語": 80, "高等數(shù)學(xué)": 90, "體育": 91, "計算機基礎(chǔ)": 85, "程序設(shè)計": 88}]data_length = len(results[0])# 將極坐標根據(jù)數(shù)據(jù)長度進行等分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]# 使雷達圖數(shù)據(jù)封閉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]]))# 設(shè)置圖形的大小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')# 設(shè)置雷達圖中每一項的標簽顯示ax.set_thetagrids(angles*180/np.pi, labels)# 設(shè)置雷達圖的0度起始位置ax.set_theta_zero_location('N')# 設(shè)置雷達圖的坐標刻度范圍ax.set_rlim(0, 100)# 設(shè)置雷達圖的坐標值顯示角度,相對于起始角度的偏移量ax.set_rlabel_position(270)ax.set_title("計算機專業(yè)大一(上)")plt.legend(["弓長張", "口天吳"], loc='best')plt.show()


          運行結(jié)果:



          繪制雷達圖需要先建立極坐標系,關(guān)于極坐標系可以自己了解一下。建立好極坐標系后可以在極坐標系中繪制折線圖、柱狀圖等,大部分情況,都是用折線圖,形成一個不規(guī)則的閉合多邊形。本文中用某高校大一的期末考試成績作為例子來演示雷達圖的效果。


          linspace(): 用于將極坐標系根據(jù)數(shù)據(jù)的維度進行等分,linspace()函數(shù)的第一個參數(shù)傳入起始角度,第二參數(shù)傳入結(jié)束角度,第三個參數(shù)傳入分成多少等份。其他參數(shù)根據(jù)需要傳入,如endpoint默認為True,最后一個數(shù)據(jù)處于結(jié)束的角度,根據(jù)本例中前面的參數(shù)0~2π,應(yīng)該設(shè)置為False,否則最后一個數(shù)據(jù)與第一個數(shù)據(jù)角度重疊了。


          concatenate(): 使雷達圖的數(shù)據(jù)是環(huán)形封閉的,concatenate()函數(shù)的第一個參數(shù)是一個元組,元組中的每個元素是一個數(shù)組,concatenate()函數(shù)將這些數(shù)組連接到一起,組成一個新的數(shù)組。要讓繪制的雷達圖封閉,將數(shù)據(jù)的第一個值連接到數(shù)組的結(jié)尾即可。


          本文用折線圖plot()來繪制雷達圖,使用figure()函數(shù)設(shè)置好圖形的大小和清晰度,然后使用subplot()函數(shù)來創(chuàng)建一張子圖。subplot()函數(shù)的第一個參數(shù)傳入長度為3的數(shù)字,第一個數(shù)字表示將畫布分成幾行,第二個數(shù)字表示將畫布分成幾列,第三個數(shù)字表示當前的子圖處于哪個位置(按從左至右、從上到下的順序排序),第三個數(shù)字不能超出前兩個數(shù)字切分的子圖數(shù)范圍。如111表示將畫布分成一行一列(只有一張子圖),當前的子圖處于第一張子圖中。在subplot()函數(shù)中,將polar參數(shù)設(shè)置成True,得到的圖形才是極坐標。


          極坐標系設(shè)置完成后,使用子圖對象ax調(diào)用折線圖函數(shù)plot(),即可繪出雷達圖。如果有多組數(shù)據(jù),多次調(diào)用plot()函數(shù)即可。


          使用set_thetagrids()方法設(shè)置雷達圖中每個維度的標簽和顯示位置。使用set_theta_zero_location()方法設(shè)置雷達圖的0度位置,可以傳入"N"、"NW"、"W"、"SW"、"S"、"SE"、"E"、"NE"八個方位縮寫。使用set_rlim()方法設(shè)置極坐標上的刻度范圍。使用set_rlabel_position()方法設(shè)置極坐標上的刻度標簽顯示位置,傳入一個相對于雷達圖0度的角度值。當然還可以根據(jù)需要設(shè)置其他屬性,如標題、圖例等。


          在上面的例子中,將兩位同學(xué)的考試成績繪制成了雷達圖,通過雷達圖,可以看出兩個人的單科成績互有高低,而整體來看,兩位同學(xué)的成績都很優(yōu)秀。上面的雷達圖中,網(wǎng)格線都是圓形的,而用折線圖連接的雷達圖兩個維度之間是直線連接的,所以將網(wǎng)格線換成多邊形會更合理一點。


          二、matplotlib繪制多邊形雷達圖


          import numpy as npimport matplotlib.pyplot as plt

          results = [{"大學(xué)英語": 87, "高等數(shù)學(xué)": 79, "體育": 95, "計算機基礎(chǔ)": 92, "程序設(shè)計": 85}, {"大學(xué)英語": 80, "高等數(shù)學(xué)": 90, "體育": 91, "計算機基礎(chǔ)": 85, "程序設(shè)計": 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("計算機專業(yè)大一(上)")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) # 隱藏圓形網(wǎng)格線 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()


          運行結(jié)果:



          在極坐標系中,極徑值相等的點在一個圓上,所以繪制的雷達圖中,網(wǎng)格線默認都是圓形的。如果要繪制多邊形的雷達圖,則需要將圓形的網(wǎng)格線隱藏,然后根據(jù)刻度范圍繪制出多邊形的網(wǎng)格線。


          首先使用plot()函數(shù),根據(jù)刻度范圍,繪制出同心的多個多邊形和多個維度方向的極軸,作為雷達圖的網(wǎng)格線,形成一張“網(wǎng)”。


          鏈式調(diào)用極坐標的spines['polar'].set_visible()方法,傳入?yún)?shù)False,將極坐標系最外圈的圓形隱藏。調(diào)用grid()方法,傳入?yún)?shù)False,將極坐標系中的的圓形網(wǎng)格線隱藏。


          修改完網(wǎng)格線后,即可達到多邊形的效果。在第二次繪制雷達圖時,將兩位同學(xué)的成績分到兩張不同的雷達圖中,并用text()方法設(shè)置了每個維度的數(shù)據(jù)標注,使用fig對象的suptitle()方法來設(shè)置整張圖形的標題。


          上面的兩次繪圖,將兩位同學(xué)的成績繪制在同一張雷達圖時,更方便對比兩位同學(xué)的成績,如比較誰更全面、更優(yōu)秀。分開繪制時,更方便分析個人的成績情況,如是否偏科。而相對于圓形的雷達圖,在多邊形的雷達圖中,不會出現(xiàn)雷達圖與網(wǎng)格線的不合理交叉(雷達圖與網(wǎng)格線交叉兩次),使用多邊形網(wǎng)格線更合理。



          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文天堂在线免费观看 | 日韩va亚洲va欧美va清高 | 狠狠综合久久 | 天堂在线观看视频 | 老妇裸体乱婬A片 |