Python數(shù)據(jù)可視化之從繪制精美雷達(dá)圖的新手指南
安裝必要的庫
我們需要安裝兩個(gè)核心的 Python 庫:matplotlib 用于繪圖,numpy 用于高效的數(shù)值計(jì)算:
pip install matplotlib numpy
繪制雷達(dá)圖的核心邏輯
創(chuàng)建雷達(dá)圖的過程可以清晰地分解為以下幾步,理解了這些步驟,你就能自如地應(yīng)對各種定制化需求:
- 數(shù)據(jù)準(zhǔn)備:確定雷達(dá)圖需要展示的幾個(gè)維度(標(biāo)簽),以及每個(gè)對象在這些維度上的具體數(shù)值。
- 創(chuàng)建極坐標(biāo)畫布:雷達(dá)圖并非畫在常規(guī)的直角坐標(biāo)系上,而是畫在一個(gè)圓形布局的極坐標(biāo)系 (Polar Coordinates) 上。
- 計(jì)算角度:根據(jù)維度的數(shù)量,將 360 度的圓進(jìn)行等分,確定每個(gè)維度軸線所在的角度。
- 閉合圖形:為了讓雷達(dá)圖形成一個(gè)封閉的多邊形,我們需要在數(shù)據(jù)和角度列表的末尾,額外補(bǔ)充上第一個(gè)點(diǎn)的數(shù)據(jù)和角度。
- 繪圖與美化:在坐標(biāo)系上繪制數(shù)據(jù)點(diǎn)連線、填充顏色、添加網(wǎng)格、標(biāo)簽、圖例和標(biāo)題,使圖表變得完整且易于解讀。
示例代碼
現(xiàn)在,讓我們用具體的代碼來實(shí)現(xiàn)一個(gè)“籃球運(yùn)動(dòng)員能力對比”的雷達(dá)圖。
import numpy as np
import matplotlib.pyplot as plt
def create_table_tennis_radar_chart():
"""
創(chuàng)建一個(gè)專門用于展示乒乓球運(yùn)動(dòng)員六維能力數(shù)據(jù)的雷達(dá)圖。
"""
# 解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 定義六個(gè)維度的標(biāo)簽
labels = np.array(['力量', '速度', '技巧', '防守', '發(fā)球', '經(jīng)驗(yàn)'])
n_labels = len(labels)
# 2. 準(zhǔn)備運(yùn)動(dòng)員的數(shù)據(jù) (這里是假設(shè)的示例數(shù)據(jù))
# “六邊形戰(zhàn)士”的數(shù)據(jù),各項(xiàng)能力非常均衡且頂尖
hex_warrior_stats = [98, 95, 99, 92, 96, 100]
# “進(jìn)攻型選手”的數(shù)據(jù),力量和速度突出,防守相對是短板
attacker_stats = [100, 98, 85, 75, 90, 80]
# 3. 計(jì)算角度 (360度/6)
angles = np.linspace(0, 2 * np.pi, n_labels, endpoint=False)
# 4. 閉合圖形數(shù)據(jù)
hex_warrior_stats_closed = np.concatenate((hex_warrior_stats, [hex_warrior_stats[0]]))
attacker_stats_closed = np.concatenate((attacker_stats, [attacker_stats[0]]))
angles_closed = np.concatenate((angles, [angles[0]]))
# 5. 繪圖
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
# 設(shè)置坐標(biāo)軸范圍
ax.set_ylim(0, 105)
# 繪制“六邊形戰(zhàn)士”
ax.plot(angles_closed, hex_warrior_stats_closed, 'o-', color='gold', linewidth=2, label='“六邊形戰(zhàn)士”')
ax.fill(angles_closed, hex_warrior_stats_closed, 'gold', alpha=0.25)
# 繪制“進(jìn)攻型選手”
ax.plot(angles_closed, attacker_stats_closed, 'o-', color='red', linewidth=2, label='進(jìn)攻型選手')
ax.fill(angles_closed, attacker_stats_closed, 'red', alpha=0.25)
# 6. 美化圖表
# 設(shè)置維度標(biāo)簽
ax.set_thetagrids(angles * 180 / np.pi, labels, fontsize=14)
# 設(shè)置半徑刻度標(biāo)簽
ax.set_rlabel_position(0)
ax.set_yticklabels(['', '20', '40', '60', '80', '100'], color="grey", size=10)
# 添加標(biāo)題和圖例
plt.title('乒乓球運(yùn)動(dòng)員能力對比雷達(dá)圖', size=22, color='black', y=1.1)
plt.legend(loc='best', bbox_to_anchor=(1.1, 1.1), fontsize=12)
# 顯示網(wǎng)格
ax.grid(True, linestyle='--', linewidth=0.5, color='gray')
# 顯示圖表
plt.show()
# --- 主程序入口 ---
if __name__ == "__main__":
create_table_tennis_radar_chart()
解析:
plt.rcParams設(shè)置:這兩行是為了確保 Matplotlib 可以正確顯示中文字符。如果你不設(shè)置,圖表中的中文可能會(huì)顯示為方框。你需要確保你的系統(tǒng)中有SimHei(黑體) 或其他中文字體。np.linspace(0, 2 * np.pi, n_labels, endpoint=False):這是創(chuàng)建角度數(shù)組的核心。它在 0 到 360 度(2*np.pi)之間,生成n_labels個(gè)等分的角度值。endpoint=False參數(shù)是關(guān)鍵,它避免了 360 度和 0 度重合。np.concatenate():這個(gè) NumPy 函數(shù)用于連接數(shù)組。我們用它將第一個(gè)數(shù)據(jù)點(diǎn)和第一個(gè)角度值拼接到數(shù)組的末尾,從而實(shí)現(xiàn)圖形的閉合。subplot_kw=dict(polar=True):在創(chuàng)建子圖(ax)時(shí),這個(gè)參數(shù)告訴 Matplotlib:“我想要的不是普通的直角坐標(biāo)系,而是一個(gè)極坐標(biāo)系”。ax.plot()和ax.fill():plot負(fù)責(zé)畫出數(shù)據(jù)的輪廓線,而fill則為這個(gè)輪廓區(qū)域填充上帶有一定透明度(alpha)的顏色,使得重疊區(qū)域也能清晰可見。ax.set_thetagrids():這個(gè)函數(shù)專門用于在極坐標(biāo)上設(shè)置角度網(wǎng)格線(也就是我們的維度軸)的位置和顯示的標(biāo)簽。它需要將弧度制的angles轉(zhuǎn)換為角度制 (angles * 180 / np.pi)。
效果

到此這篇關(guān)于Python數(shù)據(jù)可視化之從繪制精美雷達(dá)圖的新手指南的文章就介紹到這了,更多相關(guān)Python繪制雷達(dá)圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中字符串列表的相互轉(zhuǎn)換實(shí)際應(yīng)用場景
在Python編程中,經(jīng)常會(huì)遇到需要將字符串列表相互轉(zhuǎn)換的情況,這涉及到將逗號分隔的字符串轉(zhuǎn)換為列表,或者將列表中的元素連接成一個(gè)字符串,本文將深入討論這些情景,并提供豐富的示例代碼,幫助讀者更全面地理解字符串列表的轉(zhuǎn)換操作2023-12-12
python調(diào)用subprocess模塊實(shí)現(xiàn)命令行操作控制SVN的方法
這篇文章主要介紹了使用python的subprocess模塊實(shí)現(xiàn)對SVN的相關(guān)操作,通過設(shè)置GitSvn類,在該類下自定義執(zhí)行SVN常規(guī)操作的方法,需要的朋友跟隨小編一起看看吧2022-09-09
Django 多對多字段的更新和插入數(shù)據(jù)實(shí)例
這篇文章主要介紹了Django 多對多字段的更新和插入數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
用 Django 開發(fā)一個(gè) Python Web API的方法步驟
這篇文章主要介紹了用 Django 開發(fā)一個(gè) Python Web API的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
django中使用Celery 布式任務(wù)隊(duì)列過程詳解
這篇文章主要介紹了django中使用Celery 布式任務(wù)隊(duì)列實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

