面積圖,或稱區域圖,是一種隨有序變數的變化,反映數值變化的統計圖表。 面積圖也可用於多個系列數據的比較。這時,面積圖的外觀看上去類似層疊的山脈,在錯落有致的外形下表達數據的總量和趨勢。面積圖不僅可以清晰地反映出數據的趨勢變化,也能夠強調不同類別的數據間的差距對比。 面積圖的特點在於,折線與自變數坐標 ...
面積圖,或稱區域圖,是一種隨有序變數的變化,反映數值變化的統計圖表。
面積圖也可用於多個系列數據的比較。
這時,面積圖的外觀看上去類似層疊的山脈,在錯落有致的外形下表達數據的總量和趨勢。
面積圖不僅可以清晰地反映出數據的趨勢變化,也能夠強調不同類別的數據間的差距對比。
面積圖的特點在於,折線與自變數坐標軸之間的區域,會由顏色或者紋理填充。
但它的劣勢在於,填充會讓形狀互相遮蓋,反而看不清變化。一種解決方法,是使用有透明度的顏色,來“讓”出覆蓋區域。
1. 主要元素
面積圖是一種用於展示數據分佈或密度的圖表類型,主要由數據點、面積、以及X軸和Y軸組成。
面積圖可以直觀地反映數據的分佈情況。
面積圖的主要構成元素包括:
- 數據點:表示數據的具體位置和大小
- 面積:表示數據的分佈或密度
- X軸:一般是有序變數,表示數據點的變化區間
- Y軸:數據點在不同時刻的值
2. 適用的場景
面積圖適用於以下分析場景:
- 數據分佈分析:幫助分析人員瞭解數據的分佈情況,如城市的大小、人口分佈等。
- 市場需求分析:幫助企業瞭解市場需求的變化趨勢,如銷售額的增長情況等。
- 健康狀況分析:幫助醫生瞭解患者的健康狀況,如體溫、血壓等數據的變化趨勢。
3. 不適用的場景
面積圖不適用於以下分析場景:
- 數據的精確性要求較高的分析場景:面積圖無法精確地反映數據的分佈情況,在需要精確數據的場景中不適用。
- 需要顯示數據細節的分析場景:面積圖無法直觀地顯示數據的細節和變化趨勢,在需要顯示數據細節的場景中不適用。
- 需要進行多維數據分析的場景:面積圖無法直接展示多維數據,在需要進行多維數據分析的場景中不適用。
4. 分析實戰
這次使用國內生產總值相關數據來實戰面積圖的分析。
4.1. 數據來源
數據來源國家統計局公開數據,已經整理好的csv文件在:https://databook.top/nation/A02
本次分析使用其中的 A0201.csv
文件(國內生產總值數據)。
下麵的文件路徑 fp
要換成自己實際的文件路徑。
fp = "d:/share/A0201.csv"
df = pd.read_csv(fp)
df
4.2. 數據清理
從中過濾出國內生產總值(億元)和人均國內生產總值(元),然後繪製面積圖看看有什麼發現。
key1 = "國民總收入(億元)"
df[df["zbCN"]==key1].head()
key2 = "人均國內生產總值(元)"
df[df["zbCN"]==key2].head()
4.3. 分析結果可視化
國內生產總值(億元)的面積圖:
from matplotlib.ticker import MultipleLocator
with plt.style.context("seaborn-v0_8"):
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.xaxis.set_major_locator(MultipleLocator(4))
ax.xaxis.set_minor_locator(MultipleLocator(2))
data = df[df["zbCN"] == key1].copy()
data["value"] = data["value"] / 10000
data = data.sort_values(by="sj")
ax.fill_between(data["sjCN"], data["value"], label="國民總收入(萬億元)")
ax.legend(loc="upper left")
上面的代碼把Y軸的單位改成了萬億元,原先的億元作為單位,數值太大。
用面積圖來展示分析結果,不像折線圖那樣,僅僅只是變化趨勢的感覺;
通過折線下的面積不斷擴大,會感覺到國民總收入的總量在不斷變大,且2006年之後,總量增速明顯提高。
同樣分析步驟,人均收入的面積圖如下:
from matplotlib.ticker import MultipleLocator
with plt.style.context("seaborn-v0_8"):
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.xaxis.set_major_locator(MultipleLocator(4))
ax.xaxis.set_minor_locator(MultipleLocator(2))
data = df[df["zbCN"] == key2].copy()
data = data.sort_values(by="sj")
ax.fill_between(data["sjCN"], data["value"], label=key2)
ax.legend(loc="upper left")
接下來,我們把國民總收入和人均收入放在一起看,但是,這兩組數據的單位不一樣(一個是萬億元,一個是元)。
所以要用到之前 matplotlib基礎系列中介紹的雙坐標軸技巧來展示。
from matplotlib.ticker import MultipleLocator
with plt.style.context("seaborn-v0_8"):
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.xaxis.set_major_locator(MultipleLocator(4))
ax.xaxis.set_minor_locator(MultipleLocator(2))
ax_twinx = ax.twinx()
data = df[df["zbCN"] == key1].copy()
data["value"] = data["value"] / 10000
data = data.sort_values(by="sj")
ax.fill_between(data["sjCN"], data["value"],
alpha=0.5, label="國民總收入(萬億元)")
data = df[df["zbCN"] == key2].copy()
data = data.sort_values(by="sj")
ax_twinx.fill_between(data["sjCN"], data["value"],
color='r', alpha=0.2, label=key2)
ax.legend(loc="upper left")
ax_twinx.legend(loc="upper right")
兩個面積圖用了不同顏色,並加了透明度(即alpha
參數),不加透明度,顏色會互相覆蓋。
左邊的Y軸是國民總收入,右邊的Y軸是人均收入。
這兩個面積圖幾乎完全重合,正說明瞭國民總收入和人均收入是強相關的。