Matplotlib實(shí)戰(zhàn)之平行坐標(biāo)系繪制詳解
平行坐標(biāo)系是一種統(tǒng)計(jì)圖表,它包含多個(gè)垂直平行的坐標(biāo)軸,每個(gè)軸表示一個(gè)字段,并用刻度標(biāo)明范圍。通過(guò)在每個(gè)軸上找到數(shù)據(jù)點(diǎn)的落點(diǎn),并將它們連接起來(lái)形成折線,可以很容易地展示多維數(shù)據(jù)。
隨著數(shù)據(jù)增多,折線會(huì)堆疊,分析者可以從中發(fā)現(xiàn)數(shù)據(jù)的特性和規(guī)律,比如發(fā)現(xiàn)數(shù)據(jù)之間的聚類(lèi)關(guān)系。
盡管平行坐標(biāo)系與折線圖表面上看起來(lái)相似,但它并不表示趨勢(shì),各個(gè)坐標(biāo)軸之間也沒(méi)有因果關(guān)系。
因此,在使用平行坐標(biāo)系時(shí),軸的順序是可以人為決定的,這會(huì)影響閱讀的感知和判斷。較近的兩根坐標(biāo)軸會(huì)使對(duì)比感知更強(qiáng)烈。
因此,為了得出最合適和美觀的排序方式,通常需要進(jìn)行多次試驗(yàn)和比較。
同時(shí),嘗試不同的排序方式也可能有助于得出更多的結(jié)論。
此外,平行坐標(biāo)系的每個(gè)坐標(biāo)軸很可能具有不同的數(shù)據(jù)范圍,這容易導(dǎo)致讀者的誤解。
因此,在繪制圖表時(shí),最好明確標(biāo)明每個(gè)軸上的最小值和最大值。
1. 主要元素
平行坐標(biāo)系是一種常用的數(shù)據(jù)可視化方法,用于展示多個(gè)維度的數(shù)據(jù),并通過(guò)連接這些維度的線段來(lái)揭示它們之間的關(guān)系。
它的主要元素包括:
- 坐標(biāo)軸:平行坐標(biāo)系通常由垂直于數(shù)據(jù)維度的坐標(biāo)軸組成,每個(gè)坐標(biāo)軸代表一個(gè)數(shù)據(jù)維度。
- 數(shù)據(jù)點(diǎn):每個(gè)數(shù)據(jù)點(diǎn)在平行坐標(biāo)系中由一條連接各個(gè)坐標(biāo)軸的線段表示,線段的位置和形狀反映了數(shù)據(jù)點(diǎn)在各個(gè)維度上的取值。
- 連接線:連接線用于將同一數(shù)據(jù)點(diǎn)在不同維度上的線段連接起來(lái),形成數(shù)據(jù)點(diǎn)的輪廓,幫助觀察者理解數(shù)據(jù)點(diǎn)在各個(gè)維度上的變化趨勢(shì)。

2. 適用的場(chǎng)景
平行坐標(biāo)系適用的場(chǎng)景有:
- 多維數(shù)據(jù)分析:平行坐標(biāo)系適用于展示多個(gè)維度的數(shù)據(jù),幫助觀察者發(fā)現(xiàn)不同維度之間的關(guān)系和趨勢(shì),例如在探索數(shù)據(jù)集中的模式、異常值或相關(guān)性時(shí)。
- 數(shù)據(jù)分類(lèi)和聚類(lèi):通過(guò)觀察數(shù)據(jù)點(diǎn)的輪廓和分布,可以幫助觀察者識(shí)別不同的數(shù)據(jù)類(lèi)別或聚類(lèi)。
- 數(shù)據(jù)交互與過(guò)濾:平行坐標(biāo)系可以支持交互式數(shù)據(jù)探索和過(guò)濾,通過(guò)選擇或操作特定的坐標(biāo)軸或線段,可以對(duì)數(shù)據(jù)進(jìn)行篩選和聚焦。
3. 不適用的場(chǎng)景
平行坐標(biāo)系不適用的場(chǎng)景有:
- 數(shù)據(jù)維度過(guò)多:當(dāng)數(shù)據(jù)維度過(guò)多時(shí),平行坐標(biāo)系的可讀性和解釋性可能會(huì)下降,因?yàn)榫€段之間的交叉和重疊會(huì)導(dǎo)致視覺(jué)混亂。
- 數(shù)據(jù)維度之間差異較大:如果數(shù)據(jù)在不同維度上的取值范圍差異較大,那么線段之間的比較和分析可能會(huì)受到影響,因?yàn)檩^小的取值范圍可能會(huì)被較大的取值范圍所掩蓋。
- 數(shù)據(jù)具有時(shí)間序列:平行坐標(biāo)系并不適用于展示時(shí)間序列數(shù)據(jù),因?yàn)樗鼰o(wú)法準(zhǔn)確地表示數(shù)據(jù)的時(shí)間順序。在這種情況下,其他的數(shù)據(jù)可視化方法,如折線圖或時(shí)間軸圖,可能更適合。
4. 分析實(shí)戰(zhàn)
平行坐標(biāo)系適用于展示具有相同屬性的一系列數(shù)據(jù),每個(gè)坐標(biāo)系代表一種屬性。
這次選用了國(guó)家統(tǒng)計(jì)局公開(kāi)的教育類(lèi)數(shù)據(jù):databook.top/nation/A0M
選取其中幾類(lèi)具有相同屬性的數(shù)據(jù):
- A0M06:各級(jí)各類(lèi)學(xué)校專(zhuān)任教師數(shù)
- A0M07:各級(jí)各類(lèi)學(xué)校招生數(shù)
- A0M08:各級(jí)各類(lèi)學(xué)校在校學(xué)生數(shù)
- A0M09:各級(jí)各類(lèi)學(xué)校畢業(yè)生數(shù)
4.1. 數(shù)據(jù)來(lái)源
四個(gè)原始數(shù)據(jù)集是按照年份統(tǒng)計(jì)的:
fp = "d:/share/A0M06.csv" df = pd.read_csv(fp) df

這是教師相關(guān)統(tǒng)計(jì)數(shù)據(jù),其他3個(gè)數(shù)據(jù)集的結(jié)構(gòu)也類(lèi)似。
4.2. 數(shù)據(jù)清理
平行坐標(biāo)系比較的是屬性,不需要每年的數(shù)據(jù)。
所以,對(duì)于上面4個(gè)數(shù)據(jù)集,分別提取2022年的小學(xué),初中,高中,特殊教育相關(guān)4個(gè)屬性的數(shù)據(jù)。
import os
files = {
"教師數(shù)": "A0M06.csv",
"招生數(shù)": "A0M07.csv",
"在校學(xué)生數(shù)": "A0M08.csv",
"畢業(yè)學(xué)生數(shù)": "A0M09.csv",
}
data_dir = "d:/share"
data = pd.DataFrame()
for key in files:
fp = os.path.join(data_dir, files[key])
df = pd.read_csv(fp)
df_filter = pd.DataFrame(
[[
key,
df.loc[225, "value"],
df.loc[135, "value"],
df.loc[90, "value"],
df.loc[270, "value"],
]],
columns=["name", "小學(xué)", "初中", "高中", "特殊教育"],
)
data = pd.concat([data, df_filter])
data
4.3. 分析結(jié)果可視化
平行坐標(biāo)系在 matplotlib 中沒(méi)有直接提供,實(shí)現(xiàn)起來(lái)也不難:
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
import numpy as np
xnames = data.loc[:, "name"]
ynames = ["小學(xué)", "初中", "高中", "特殊教育"]
ys = np.array(data.iloc[:, 1:].values.tolist())
ymins = ys.min(axis=0)
ymaxs = ys.max(axis=0)
dys = ymaxs - ymins
ymins -= dys * 0.05 # Y軸的上下限增加 5% 的冗余
ymaxs += dys * 0.05
#每個(gè)坐標(biāo)系的上下限不一樣,調(diào)整顯示方式
zs = np.zeros_like(ys)
zs[:, 0] = ys[:, 0]
zs[:, 1:] = (ys[:, 1:] - ymins[1:]) / dys[1:] * dys[0] + ymins[0]
fig, host = plt.subplots(figsize=(10, 4))
axes = [host] + [host.twinx() for i in range(ys.shape[1] - 1)]
for i, ax in enumerate(axes):
ax.set_ylim(ymins[i], ymaxs[i])
ax.spines["top"].set_visible(False)
ax.spines["bottom"].set_visible(False)
if ax != host:
ax.spines["left"].set_visible(False)
ax.yaxis.set_ticks_position("right")
ax.spines["right"].set_position(("axes", i / (ys.shape[1] - 1)))
host.set_xlim(0, ys.shape[1] - 1)
host.set_xticks(range(ys.shape[1]))
host.set_xticklabels(ynames, fontsize=14)
host.tick_params(axis="x", which="major", pad=7)
host.spines["right"].set_visible(False)
host.xaxis.tick_top()
host.set_title("各類(lèi)學(xué)校的師生數(shù)目比較", fontsize=18, pad=12)
colors = plt.cm.Set1.colors
legend_handles = [None for _ in xnames]
for j in range(ys.shape[0]):
verts = list(
zip(
[x for x in np.linspace(0, len(ys) - 1, len(ys) * 3 - 2, endpoint=True)],
np.repeat(zs[j, :], 3)[1:-1],
)
)
codes = [Path.MOVETO] + [Path.CURVE4 for _ in range(len(verts) - 1)]
path = Path(verts, codes)
patch = patches.PathPatch(
path, facecolor="none", lw=2, alpha=0.7, edgecolor=colors[j]
)
legend_handles[j] = patch
host.add_patch(patch)
host.legend(
xnames,
loc="lower center",
bbox_to_anchor=(0.5, -0.18),
ncol=len(xnames),
fancybox=True,
shadow=True,
)
plt.tight_layout()
plt.show()
從圖表中,可以看出一下幾點(diǎn),和我們對(duì)實(shí)際情況的印象是差不多的:
- 教師數(shù)量遠(yuǎn)小于學(xué)生數(shù)量
- 從小學(xué)到初中,高中,學(xué)生數(shù)量不斷減少
- 招生數(shù)量和畢業(yè)生數(shù)量差不多
平行坐標(biāo)系用于比較不同數(shù)據(jù)集的相同屬性。
以上就是Matplotlib實(shí)戰(zhàn)之平行坐標(biāo)系繪制詳解的詳細(xì)內(nèi)容,更多關(guān)于Matplotlib平行坐標(biāo)系的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3 動(dòng)態(tài)模塊導(dǎo)入與全局變量使用實(shí)例
今天小編就為大家分享一篇python3 動(dòng)態(tài)模塊導(dǎo)入與全局變量使用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python實(shí)現(xiàn)停車(chē)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)停車(chē)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
對(duì)python3.4 字符串轉(zhuǎn)16進(jìn)制的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python3.4 字符串轉(zhuǎn)16進(jìn)制的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
淺談pytorch和Numpy的區(qū)別以及相互轉(zhuǎn)換方法
今天小編就為大家分享一篇淺談pytorch和Numpy的區(qū)別以及相互轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python 實(shí)現(xiàn)得到當(dāng)前時(shí)間偏移day天后的日期方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)得到當(dāng)前時(shí)間偏移day天后的日期方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python中Word文件自動(dòng)化操作小結(jié)
Python-docx是一個(gè)Python庫(kù),提供了對(duì)Microsoft?Word(.docx文件)的讀寫(xiě)和修改功能,本文主要介紹了如何使用Python-docx實(shí)現(xiàn)Word文件自動(dòng)化操作,需要的可以參考下2024-04-04
python爬蟲(chóng)多次請(qǐng)求超時(shí)的幾種重試方法(6種)
這篇文章主要介紹了python爬蟲(chóng)多次請(qǐng)求超時(shí)的幾種重試方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
python實(shí)現(xiàn)旋轉(zhuǎn)和水平翻轉(zhuǎn)的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)旋轉(zhuǎn)和水平翻轉(zhuǎn)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10

