1. 程式人生 > 實用技巧 >Python資料視覺化:如何用Matplotlib建立柱狀圖

Python資料視覺化:如何用Matplotlib建立柱狀圖

前言

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

以下文章來源於Trochil蜂鳥資料,作者:蜂鳥資料Trochil

本文的主題是如何用Matplotlib建立柱狀圖。

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

plt.style.use("ggplot")

1. 基礎柱狀圖

柱狀圖(bar chart): 用長方形(柱子)的長度表示數值的統計圖表,又稱為條形圖。柱狀圖常用來對比兩個以上的數值,適用於較小的資料集。

Matplotlib建立柱狀圖的介面:bar(x, height, width, bottom, align, color)

  • x: 柱子的x軸座標
  • height: 柱子高度,y軸座標
  • width: 柱子寬度,預設0.8
  • bottom: 柱子底部的y軸座標,預設為0
  • align: 柱子與x軸座標的對齊方式,預設'center'
  • color: 柱子顏色
  • orientation: 柱子方向,'horizontal' or 'vertical'

bar()預設建立垂直柱狀圖,barh()可建立水平柱狀圖,原理基本一致。

# 虛擬資料
x = ["A", "B", "C", "D", "E", "F
", "G", "H"] y = [150, 85.2, 65.2, 85, 45, 120, 51, 64] # 柱狀圖和散點圖不同,散點圖的(x,y)均為數值變數 # 柱狀圖的x軸顯示分類變數,有兩種處理方式 # 方式1:自己建立x軸座標,並提供對應的標籤 # 方式2:讓Matplotlib自動完成對映 # 方式1 # xticks = np.arange(len(x)) # 每根柱子的x軸座標 # xlabels = x # 每根柱子的標籤 # fig, ax = plt.subplots(figsize=(10, 7)) # ax.bar(x=xticks, height=y, tick_label=xlabels)
# 方式2(推薦) fig, ax = plt.subplots(figsize=(10, 7)) ax.bar(x=x, height=y) ax.set_title("Simple Bar Plot", fontsize=15)

2. 調整樣式

Matplotlib建立圖表的優勢在於,使用者可以定製每一個細節,接下來調整柱狀圖的樣式,包括改變柱子的寬度,對齊方式和顏色,以及如何把數值新增到圖表中。

x = ["A", "B", "C", "D", "E", "F", "G", "H"]
y = [150, 85.2, 65.2, 85, 45, 120, 51, 64]

fig, ax = plt.subplots(figsize=(10, 7))
ax.bar(
    x=x,  # Matplotlib自動將非數值變數轉化為x軸座標
    height=y,  # 柱子高度,y軸座標
    width=0.6,  # 柱子寬度,預設0.8,兩根柱子中心的距離預設為1.0
    align="center",  # 柱子的對齊方式,'center' or 'edge'
    color="grey",  # 柱子顏色
    edgecolor="red",  # 柱子邊框的顏色
    linewidth=2.0  # 柱子邊框線的大小
)
ax.set_title("Adjust Styles of Bar plot", fontsize=15)

# 一個常見的場景是:每根柱子上方新增數值標籤
# 步驟:
# 1. 準備要新增的標籤和座標
# 2. 呼叫ax.annotate()將文字新增到圖表
# 3. 調整樣式,例如標籤大小,顏色和對齊方式
xticks = ax.get_xticks()
for i in range(len(y)):
    xy = (xticks[i], y[i] * 1.03)
    s = str(y[i])
    ax.annotate(
        s=s,  # 要新增的文字
        xy=xy,  # 將文字新增到哪個位置
        fontsize=12,  # 標籤大小
        color="blue",  # 標籤顏色
        ha="center",  # 水平對齊
        va="baseline"  # 垂直對齊
    )

3. 堆積柱狀圖

有時候想在同一根柱子上顯示兩個不同的數值,即所謂堆積柱狀圖(stacked bar chart)。

假設一個場景,有6家門店,每家門店都銷售三種產品,用堆積柱狀圖顯示每家門店三種產品的銷量。

shops = ["A", "B", "C", "D", "E", "F"]
sales_product_1 = [100, 85, 56, 42, 72, 15]
sales_product_2 = [50, 120, 65, 85, 25, 55]
sales_product_3 = [20, 35, 45, 27, 55, 65]

fig, ax = plt.subplots(figsize=(10, 7))
# 先建立一根柱子,顯示第一種產品的銷量
ax.bar(shops, sales_product_1, color="red", label="Product_1")
# 第二根柱子“堆積”在第一根柱子上方,通過'bottom'調整,顯示第二種產品的銷量
ax.bar(shops, sales_product_2, color="blue", bottom=sales_product_1, label="Product_2")
# 第三根柱子“堆積”在第二根柱子上方,通過'bottom'調整,顯示第三種產品的銷量
ax.bar(shops, sales_product_3, color="green", 
       bottom=np.array(sales_product_2) + np.array(sales_product_1), label="Product_3")

ax.set_title("Stacked Bar plot", fontsize=15)
ax.set_xlabel("Shops")
ax.set_ylabel("Product Sales")
ax.legend()

4. 分組柱狀圖

分組柱狀圖的原理跟堆積柱狀圖類似,但柱子不再是堆疊在一起,而是在相同的X軸標籤上分成幾根更窄的柱子,這些柱子都屬於同一個組。

沿用上面的案例。

shops = ["A", "B", "C", "D", "E", "F"]
sales_product_1 = [100, 85, 56, 42, 72, 15]
sales_product_2 = [50, 120, 65, 85, 25, 55]
sales_product_3 = [20, 35, 45, 27, 55, 65]

# 建立分組柱狀圖,需要自己控制x軸座標
xticks = np.arange(len(shops))

fig, ax = plt.subplots(figsize=(10, 7))
# 所有門店第一種產品的銷量,注意控制柱子的寬度,這裡選擇0.25
ax.bar(xticks, sales_product_1, width=0.25, label="Product_1", color="red")
# 所有門店第二種產品的銷量,通過微調x軸座標來調整新增柱子的位置
ax.bar(xticks + 0.25, sales_product_2, width=0.25, label="Product_2", color="blue")
# 所有門店第三種產品的銷量,繼續微調x軸座標調整新增柱子的位置
ax.bar(xticks + 0.5, sales_product_3, width=0.25, label="Product_3", color="green")

ax.set_title("Grouped Bar plot", fontsize=15)
ax.set_xlabel("Shops")
ax.set_ylabel("Product Sales")
ax.legend()

# 最後調整x軸標籤的位置
ax.set_xticks(xticks + 0.25)
ax.set_xticklabels(shops)

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等