【matplotlib 實戰】--堆疊面積圖

wang_yb發表於2023-10-01

堆疊面積圖和麵積圖都是用於展示資料隨時間變化趨勢的統計圖表,但它們的特點有所不同。
面積圖的特點在於它能夠直觀地展示數量之間的關係,而且不需要標註資料點,可以輕鬆地觀察資料的變化趨勢。而堆疊面積圖則更適合展示多個資料系列之間的變化趨勢,它們一層層的堆疊起來,每個資料系列的起始點是上一個資料系列的結束點,多資料列的展示更加直觀和易於理解。

堆疊面積圖觀察幾個資料系列隨時間的變化情況時,既能看到各資料系列的走勢,又能看到整體的規模,
但是,過多的系列,也會導致難以分辨。
此外,堆疊面積圖展示的資料一般會有時間上的關聯,當資料沒有時間上的關聯時,建議適用堆疊柱狀圖。

1. 主要元素

堆疊面積圖是一種用於展示資料分類、分組和資料關聯性的圖表,主要由以下幾個元素組成:

  1. 堆疊面積:表示資料的分佈或密度
  2. 圖例:圖例用於說明堆疊圖的繪製規則和引數
  3. X軸:一般是有序變數,表示資料點的變化區間
  4. Y軸:資料點在不同時刻的值

image.png

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

image.png

4.2. 資料清理

過濾出三大產業的資料:

key1 = "第一產業增加值(億元)"
key2 = "第二產業增加值(億元)"
key3 = "第三產業增加值(億元)"

df = df[(df["zbCN"] == key1)
        | (df["zbCN"] == key2)
        | (df["zbCN"] == key3)]
df

image.png

4.3. 分析結果視覺化

繪製三大產業的堆疊面積圖:

from matplotlib.ticker import MultipleLocator

key1 = "第一產業增加值(億元)"
key2 = "第二產業增加值(億元)"
key3 = "第三產業增加值(億元)"

val1 = df[(df["zbCN"] == key1)].sort_values("sj")
val2 = df[(df["zbCN"] == key2)].sort_values("sj")
val3 = df[(df["zbCN"] == key3)].sort_values("sj")

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.stackplot(
        val1["sjCN"],
        [val1["value"], val2["value"], val3["value"]],
        labels=[key1, key2, key3],
        alpha=0.8,
    )

    ax.legend(loc="upper left")

image.png

各個資料集在堆疊面積圖中不會重合,
所以不僅可以看出各個產業的增長情況,還能看出整體的增長主要來自哪個產業的影響。

從分析結果可以看出,我國的經濟增長主要來自於第二,第三產業的增長。
這個結果和之前的文章中關於人口的分析也是相吻合的,在那個文章中,我們發現農業人口大量減少,城鎮人口大量增加。