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