Python 利用pandas和matplotlib繪製堆疊柱狀圖

2023-11-11 06:01:06

在資料視覺化中,堆疊柱狀圖是一種常用的圖表型別,它能夠清晰地展示多個類別的資料,並突出顯示每個類別中各部分的總量和組成比例。本文將演示如何使用 Python 的 pandas 和 matplotlib 庫繪製優化的堆疊柱狀圖,並展示了銷售數量隨店鋪名稱變化的情況。

匯入必要的庫

首先,我們需要匯入 pandas 和 matplotlib.pyplot 庫,並指定中文字型為黑體,程式碼如下:

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['SimHei']  # 指定中文字型為黑體

讀取資料

接下來,我們使用 pandas 的 read_excel 函數讀取 Excel 檔案中的資料,並指定讀取的工作表名稱為「Sheet3」,如下所示:

df = pd.read_excel(r'C:\Users\liuchunlin2\Desktop\新建資料夾\新建 XLSX 工作表.xlsx', sheet_name='Sheet3')

設定圖形引數

在繪製堆疊柱狀圖之前,我們需要設定柱狀圖的寬度和 x 軸的位置,程式碼如下:

bar_width = 0.35  # 設定柱狀圖的寬度
x = df.index  # 設定x軸的位置

繪製堆疊柱狀圖

使用 matplotlib 庫的 subplots 函數建立圖形物件,並使用 bar 函數繪製堆疊柱狀圖,具體程式碼如下:

fig, ax = plt.subplots()
rects1 = ax.bar(x, df['銷售數量'], bar_width, label='銷售數量')
rects2 = ax.bar(x, df['銷售數量2'], bar_width, bottom=df['銷售數量'], label='銷售數量2')

新增標籤和標題

我們為圖形新增軸標籤、標題、刻度和圖例,使其更具可讀性,具體程式碼如下:

ax.set_xlabel('店鋪名稱')
ax.set_ylabel('銷售數量')
ax.set_title('Stacked Bar Chart')
ax.set_xticks(x)
ax.set_xticklabels(df['店鋪名稱'])
ax.legend()

顯示資料標籤

最後,我們使用 annotate 函數在每個柱子上方顯示資料標籤,以展示具體的銷售數量,具體程式碼如下:

for rect in rects1:
    height = rect.get_height()
    ax.annotate(f'{height}', xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3),
                textcoords='offset points', ha='center', va='bottom')

for rect1, rect2 in zip(rects1, rects2):
    height1 = rect1.get_height()
    height2 = rect2.get_height()
    total_height = height1 + height2
    ax.annotate(f'{height2}', xy=(rect2.get_x() + rect2.get_width() / 2, total_height), xytext=(0, 3),
                textcoords='offset points', ha='center', va='bottom')

顯示圖形

最後,使用 plt.show() 函數顯示繪製好的堆疊柱狀圖,程式碼如下:

plt.show()

通過以上步驟,我們成功繪製出了堆疊柱狀圖,展示了不同店鋪的銷售數量情況。

圖表效果圖展示

 完整程式碼:

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = ['SimHei']  # 指定中文字型為黑體
# 讀取Excel檔案
df = pd.read_excel(r'C:\Users\liuchunlin2\Desktop\新建資料夾\新建 XLSX 工作表.xlsx', sheet_name='Sheet3')
# 設定柱狀圖的寬度
bar_width = 0.35
# 設定x軸的位置
x = df.index

# 繪製堆疊柱狀圖
fig, ax = plt.subplots()
rects1 = ax.bar(x, df['銷售數量'], bar_width, label='銷售數量')
rects2 = ax.bar(x, df['銷售數量2'], bar_width, bottom=df['銷售數量'], label='銷售數量2')

# 新增標籤和標題
ax.set_xlabel('店鋪名稱')
ax.set_ylabel('銷售數量')
ax.set_title('Stacked Bar Chart')
ax.set_xticks(x)
ax.set_xticklabels(df['店鋪名稱'])
ax.legend()

# 在每個柱子上方顯示資料標籤
for rect in rects1:
    height = rect.get_height()
    ax.annotate(f'{height}', xy=(rect.get_x() + rect.get_width() / 2, height), xytext=(0, 3),
                textcoords='offset points', ha='center', va='bottom')

for rect1, rect2 in zip(rects1, rects2):
    height1 = rect1.get_height()
    height2 = rect2.get_height()
    total_height = height1 + height2
    ax.annotate(f'{height2}', xy=(rect2.get_x() + rect2.get_width() / 2, total_height), xytext=(0, 3),
                textcoords='offset points', ha='center', va='bottom')

# 顯示圖形
plt.show()