Python 利用pandas和matplotlib繪製雙柱狀圖

2023-11-07 06:01:30

在資料分析和視覺化中,常用的一種圖形型別是柱狀圖。柱狀圖能夠清晰地展示不同分類變數的數值,並支援多組資料進行對比。本篇文章將介紹如何使用Python繪製雙柱狀圖。

準備工作

在開始繪製柱狀圖之前,需要先安裝matplotlib和pandas這兩個Python庫。可以通過pip安裝:

pip install matplotlib 
pip install pandas

匯入所需庫

import pandas as pd
import matplotlib.pyplot as plt

讀取並處理資料

# 讀取Excel檔案
df = pd.read_excel(r'C:\Users\Admin\Desktop\資料核對\新建 XLSX 工作表.xlsx', sheet_name='Sheet3')

# 設定柱狀圖的寬度
bar_width = 0.35

# 設定x軸的位置
x = df.index

首先使用Pandas讀取Excel檔案,然後根據實際情況設定柱狀圖的寬度和x軸位置。這裡我們使用DataFrame的索引作為x軸。

繪製柱狀圖

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

使用matplotlib繪製柱狀圖,其中subplots()方法會返回一個Figure物件和一個Axes物件。然後使用bar()方法繪製兩組柱狀圖,並設定標籤。

新增標籤和標題

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

新增資料標籤

# 新增資料標籤
for rect in rects1:
    height = rect.get_height()
    ax.annotate('{}'.format(height),
                xy=(rect.get_x() + rect.get_width() / 2, height),
                xytext=(0, 3),  # 3 points vertical offset
                textcoords="offset points",
                ha='center', va='bottom')

for rect in rects2:
    height = rect.get_height()
    ax.annotate('{}'.format(height),
                xy=(rect.get_x() + rect.get_width() / 2, height/2),
                xytext=(0, 3),  # 3 points vertical offset
                textcoords="offset points",
                ha='center', va='top')

對於每個柱狀圖,使用annotate()方法新增資料標籤。

顯示圖形

# 顯示圖形
plt.show()

最後使用show()方法顯示圖形。

效果圖展示

 

完整程式碼

import pandas as pd
import matplotlib.pyplot as plt

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

# 讀取Excel檔案
df = pd.read_excel(r'C:\Users\Admin\Desktop\資料核對\新建 XLSX 工作表.xlsx', sheet_name='Sheet3')

# 設定柱狀圖的寬度
bar_width = 0.35

# 設定x軸的位置
x = df.index

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

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

# 新增資料標籤
for rect in rects1:
    height = rect.get_height()
    ax.annotate('{}'.format(height),
                xy=(rect.get_x() + rect.get_width() / 2, height),
                xytext=(0, 3),  # 3 points vertical offset
                textcoords="offset points",
                ha='center', va='bottom')

for rect in rects2:
    height = rect.get_height()
    ax.annotate('{}'.format(height),
                xy=(rect.get_x() + rect.get_width() / 2, height/2),
                xytext=(0, 3),  # 3 points vertical offset
                textcoords="offset points",
                ha='center', va='top')

# 顯示圖形
plt.show()