Matplotlib 中的疊加條形圖

Suraj Joshi 2023年1月30日
  1. 疊加條形圖 Matplotlib
  2. 使用 Pandasd 的 Matplotlib 疊加條形圖的方法
Matplotlib 中的疊加條形圖

我們在 Matplotlib 中使用 matplotlib.pyplot.bar() 方法生成條形圖。為了將某個資料集的條形圖堆疊在另一個資料集上,我們將所有需要堆疊的資料集相加,並將總和作為 bottom 引數傳遞給 bar() 方法。

import matplotlib.pyplot as plt

data1 = [30, 20, 10, 0, 0]
data2 = [20, 20, 20, 20, 0]
data3 = [50, 60, 70, 80, 100]

year = ["2015", "2016", "2017", "2018", "2019"]

fig, ax = plt.subplots(3, 1, figsize=(10, 8))

ax[0].bar(year, data1, color="red")
ax[0].legend(["C++"])
ax[1].bar(year, data2, color="yellow")
ax[1].legend(["JavaScript"])
ax[2].bar(year, data3, color="green")
ax[2].legend(["Python"])

plt.show()

輸出:

解釋堆疊條形圖 Matplotlib 的例子

在這裡,我們有三個獨立的條形圖,分別代表了某公司員工五年來對一種程式語言的偏好。我們將討論如何將一門語言的條形圖疊加到另一門語言上,並通過一張條形圖來研究多年來人們對程式語言的整體選擇。

疊加條形圖 Matplotlib

import numpy as np
import matplotlib.pyplot as plt

data1 = [30, 20, 10, 0, 0]
data2 = [20, 20, 20, 20, 0]
data3 = [50, 60, 70, 80, 100]

year = ["2015", "2016", "2017", "2018", "2019"]

plt.figure(figsize=(9, 7))
plt.bar(year, data3, color="green", label="Python")
plt.bar(year, data2, color="yellow", bottom=np.array(data3), label="JavaScript")
plt.bar(year, data1, color="red", bottom=np.array(data3) + np.array(data2), label="C++")

plt.legend(loc="lower left", bbox_to_anchor=(0.8, 1.0))
plt.show()

輸出:

Matplotlib 中的疊加條形圖

它將一個條形圖疊加在另一個條形圖上。在圖中,我們先將 data3 繪製成 Python 資料,作為其他條形圖的基礎,然後再繪製 data2 的條形圖,將 data3 的條形圖作為 data2 條形圖的基礎。為了將 data2 的條形圖疊加到 data3 上,我們設定 bottom=np.array(data3)

同樣,在繪製 data1 的條形圖時,我們以 data2data3 的條形圖為基礎。為此,我們在繪製 data1 的條形圖時,設定 bottom=np.array(data3)+np.array(data2)

需要注意的是,我們必須使用 NumPy 陣列來新增 bottom 引數的資料。如果我們設定 bottom=data3+data2,它將通過在列表 data3 的末尾追加 data2 的元素來建立列表。

如果我們不想使用 NumPy 陣列,我們可以使用列表推導法來新增 list 的對應元素。

import numpy as np
import matplotlib.pyplot as plt

data1 = [30, 20, 10, 0, 0]
data2 = [20, 20, 20, 20, 0]
data3 = [50, 60, 70, 80, 100]

year = ["2015", "2016", "2017", "2018", "2019"]

plt.figure(figsize=(9, 7))
plt.bar(year, data3, color="green", label="Python")
plt.bar(year, data2, color="yellow", bottom=data3, label="JavaScript")
plt.bar(
    year,
    data1,
    color="red",
    bottom=[sum(data) for data in zip(data2, data3)],
    label="C++",
)

plt.legend(loc="lower left", bbox_to_anchor=(0.8, 1.0))
plt.show()

輸出:

在 Matplotlib 中使用列表推導式疊加條形圖

使用 Pandasd 的 Matplotlib 疊加條形圖的方法

我們也可以使用 Python 中的 Pandas 庫,在 Python 中生成堆疊的柱狀圖。

import pandas as pd
import matplotlib.pyplot as plt

years = ["2015", "2016", "2017", "2018", "2019"]
data = {
    "Python": [50, 60, 70, 80, 100],
    "JavaScript": [20, 20, 20, 20, 0],
    "C++": [30, 20, 10, 0, 0],
}

df = pd.DataFrame(data, index=years)

df.plot(kind="bar", stacked=True, figsize=(10, 8))
plt.legend(loc="lower left", bbox_to_anchor=(0.8, 1.0))
plt.show()

輸出:

使用 Pandas 在 Matplotlib 中生成堆積條形圖

它從 Pandas DataFrame 中生成一個堆疊的條形圖,其中一列的條形圖堆疊在 DataFrame 中每個索引的另一列上。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

相關文章 - Matplotlib Visualizations