名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》
創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊)
訂閱專欄:《Python星球日記》
目錄
- 一、Matplotlib 簡介
- 1. 什么是 Matplotlib?為什么使用 Matplotlib?
- 2. 安裝與導入
- 二、基本繪圖
- 1. 繪制折線圖:`plot()`
- 繪制多條線
- 自定義線條樣式
- 2. 繪制柱狀圖:`bar()` 和 `barh()`
- 垂直柱狀圖
- 水平柱狀圖
- 分組柱狀圖
- 3. 繪制餅圖:`pie()`
- 三、圖形美化
- 1. 添加標題、標簽、圖例
- 標題和標簽
- 圖例
- 2. 調整顏色、樣式、網格
- 設置樣式
- 設置顏色和透明度
- 添加網格
- 3. 調整坐標軸
- 4. 子圖布局
- 四、練習:可視化銷售數據趨勢
- 1??準備數據
- 2??繪制銷售趨勢圖表
- 3??分析與總結
- 五、總結與拓展
- 1. 核心知識點回顧
- 2. 進階技巧
- 3. 學習資源推薦
👋 專欄介紹: Python星球日記專欄介紹(持續更新ing)
? 上一篇: Python星球日記 - 第22天:NumPy 基礎
歡迎來到Python星球🪐的第26天!
今天我們將學習Matplotlib,Python中最流行的數據可視化庫。通過本文,你將了解如何創建各種類型的圖表,以及如何美化它們,讓你的數據"說話"更有說服力。
一、Matplotlib 簡介
1. 什么是 Matplotlib?為什么使用 Matplotlib?
Matplotlib 是 Python 中最流行的繪圖庫,它提供了一個完整的 2D 繪圖環境,可以創建出具有出版質量的圖形。
由 John Hunter 于 2003 年創建,最初的目的是為了復現 MATLAB 的繪圖功能。
為什么要使用 Matplotlib?以下是幾個主要原因:
- 功能豐富:支持線圖、散點圖、柱狀圖、餅圖、直方圖等多種圖表類型
- 高度可定制:幾乎每個圖形元素都可以自定義
- 廣泛集成:與 NumPy、Pandas 和其他科學計算庫緊密集成
- 行業標準:在數據科學、機器學習和科學研究中被廣泛使用
- 跨平臺:支持多種輸出格式,包括 PNG、PDF、SVG、EPS 等
Matplotlib 的架構主要分為兩種接口:
- pyplot 接口:提供類似 MATLAB 的命令式繪圖方式,適合簡單快速的繪圖
- 面向對象接口:提供更精確的控制和更復雜的圖形組合,適合高度自定義的圖表
2. 安裝與導入
安裝 Matplotlib 非常簡單,可以使用 pip 或 conda:
# 使用 pip 安裝
pip install matplotlib# 使用 conda 安裝
conda install matplotlib
在代碼中導入 Matplotlib:
# 標準導入方式
import matplotlib.pyplot as plt
import numpy as np # 通常還需要導入 NumPy 進行數據處理
注意:
plt
是導入matplotlib.pyplot
的常用別名,幾乎所有 Python 數據科學代碼都使用這個約定。
二、基本繪圖
Matplotlib 提供了多種基本圖表類型。下面我們將學習最常用的三種:折線圖、柱狀圖和餅圖。
1. 繪制折線圖:plot()
折線圖是最基本的圖表類型,用于展示數據的變化趨勢。使用 plt.plot()
函數可以輕松創建:
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 準備數據
x = np.linspace(0, 10, 100) # 從0到10創建100個等間距的點
y = np.sin(x) # 計算每個點的正弦值# 繪制折線圖
plt.figure(figsize=(8, 4)) # 創建畫布,設置大小為 8x4 英寸
plt.plot(x, y) # 繪制折線圖
plt.title('正弦函數') # 添加標題
plt.xlabel('x') # 添加 x 軸標簽
plt.ylabel('sin(x)') # 添加 y 軸標簽
plt.grid(True) # 添加網格線
plt.show() # 顯示圖形
輸出結果:
繪制多條線
你可以在一個圖表上繪制多條線,只需多次調用 plot()
函數:
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), label='sin(x)') # 繪制正弦函數
plt.plot(x, np.cos(x), label='cos(x)') # 繪制余弦函數
plt.plot(x, np.tan(x), label='tan(x)') # 繪制正切函數plt.title('三角函數')
plt.xlabel('x')
plt.ylabel('y')
plt.legend() # 添加圖例
plt.grid(True)
plt.show()
自定義線條樣式
可以通過格式字符串或關鍵字參數自定義線條的樣式:
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'r-', linewidth=2) # 紅色實線
plt.plot(x, np.cos(x), 'b--', linewidth=2) # 藍色虛線
plt.plot(x, np.sin(x) + np.cos(x), 'g-.', linewidth=2) # 綠色點劃線
plt.show()
樣式字符串的構成:
- 顏色:‘r’ (紅)、‘g’ (綠)、‘b’ (藍)、‘c’ (青)、‘m’ (洋紅)、‘y’ (黃)、‘k’ (黑)、‘w’ (白)
- 線型:‘-’ (實線)、‘–’ (虛線)、‘-.’ (點劃線)、‘:’ (點線)
- 標記:‘o’ (圓點)、‘s’ (方塊)、‘^’ (三角形)、‘*’ (星號)等
2. 繪制柱狀圖:bar()
和 barh()
柱狀圖用于比較不同類別的數據大小,分為垂直柱狀圖(bar()
)和水平柱狀圖(barh()
)。
垂直柱狀圖
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 準備數據
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 40, 30, 55, 15]# 創建垂直柱狀圖
plt.figure(figsize=(8, 6))
plt.bar(categories, values, color='skyblue', edgecolor='navy')
plt.title('各類別數據比較')
plt.xlabel('類別')
plt.ylabel('數值')
plt.show()
水平柱狀圖
plt.figure(figsize=(8, 6))
plt.barh(categories, values, color='skyblue', edgecolor='navy')
plt.title('各類別數據比較')
plt.xlabel('數值')
plt.ylabel('類別')
plt.show()
分組柱狀圖
分組柱狀圖用于比較多個數據集:
# 準備數據
categories = ['A', 'B', 'C', 'D', 'E']
values1 = [25, 40, 30, 55, 15]
values2 = [15, 30, 40, 20, 35]# 設置柱狀圖位置
x = np.arange(len(categories)) # 類別標簽位置
width = 0.35 # 柱子寬度# 創建分組柱狀圖
plt.figure(figsize=(10, 6))
plt.bar(x - width/2, values1, width, label='組1', color='skyblue')
plt.bar(x + width/2, values2, width, label='組2', color='lightgreen')# 添加標簽和圖例
plt.title('兩組數據比較')
plt.xlabel('類別')
plt.ylabel('數值')
plt.xticks(x, categories) # 替換 x 軸刻度標簽
plt.legend()
plt.grid(True, axis='y') # 只顯示水平網格線
plt.show()
3. 繪制餅圖:pie()
餅圖用于顯示數據的比例關系,特別適合表示占比或分布情況。
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 準備數據
labels = ['A', 'B', 'C', 'D', 'E']
sizes = [15, 30, 25, 10, 20] # 各部分大小
explode = (0, 0.1, 0, 0, 0) # 突出顯示第二部分
colors = ['gold', 'lightcoral', 'lightskyblue', 'lightgreen', 'lightpink'] # 各部分顏色# 創建餅圖
plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', # 顯示百分比格式shadow=True, # 添加陰影startangle=90) # 起始角度
plt.axis('equal') # 確保餅圖是圓形的
plt.title('數據占比分布')
plt.show()
輸出結果:
餅圖的主要參數:
sizes
:各部分的大小explode
:特定部分的突出顯示labels
:各部分的標簽colors
:各部分的顏色autopct
:顯示百分比的格式shadow
:是否添加陰影效果startangle
:起始角度
三、圖形美化
默認的 Matplotlib 圖形樣式較為簡單,通過一些美化設置可以讓圖表更加專業和美觀。
1. 添加標題、標簽、圖例
標題和標簽
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))# 添加標題和標簽
plt.title('正弦函數圖', fontsize=16) # 添加標題,設置字體大小
plt.xlabel('X 軸', fontsize=12) # 添加 x 軸標簽
plt.ylabel('Y 軸', fontsize=12) # 添加 y 軸標簽# 添加文本注釋
plt.text(5, 0.5, 'sin(x) 的最大值是 1', fontsize=12)plt.show()
圖例
圖例幫助識別圖表中的不同數據系列:
plt.figure(figsize=(10, 6))# 繪制多條線并設置標簽
plt.plot(x, np.sin(x), 'r-', label='sin(x)')
plt.plot(x, np.cos(x), 'b--', label='cos(x)')
plt.plot(x, np.sin(x) * np.cos(x), 'g-.', label='sin(x)·cos(x)')# 添加圖例
plt.legend(loc='best', # 自動選擇最佳位置fontsize=12, # 設置字體大小frameon=True, # 顯示邊框shadow=True) # 添加陰影效果plt.show()
圖例位置選項:
'best'
:自動選擇最佳位置'upper right'
,'upper left'
,'lower right'
,'lower left'
:四個角'center'
,'center left'
,'center right'
,'lower center'
,'upper center'
:中心和邊緣
2. 調整顏色、樣式、網格
設置樣式
Matplotlib 提供了多種預設樣式可供選擇:
# 查看可用樣式
print(plt.style.available)# 設置樣式
plt.style.use('seaborn-v0_8-darkgrid') # 使用 Seaborn 暗網格樣式plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
plt.title('使用 Seaborn 樣式的圖表')
plt.show()
常用樣式包括:‘ggplot’, ‘seaborn’, ‘bmh’, ‘dark_background’, ‘fivethirtyeight’ 等。
設置顏色和透明度
plt.figure(figsize=(10, 6))# 設置顏色和透明度
plt.plot(x, np.sin(x), color='#FF5733', alpha=0.8, linewidth=2)
plt.fill_between(x, np.sin(x), alpha=0.3, color='#FF5733') # 添加填充區域plt.title('帶填充區域的正弦函數')
plt.show()
顏色可以通過名稱(如 ‘red’)、十六進制代碼(如 ‘#FF5733’)或 RGB 元組(如 (1, 0, 0))指定。
添加網格
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))# 添加網格
plt.grid(True, # 顯示網格linestyle='--', # 虛線樣式alpha=0.7, # 透明度color='gray') # 顏色plt.show()
3. 調整坐標軸
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))# 設置坐標軸范圍
plt.xlim(0, 10) # 設置 x 軸范圍
plt.ylim(-1.5, 1.5) # 設置 y 軸范圍# 設置刻度
plt.xticks(np.arange(0, 11, 2)) # 設置 x 軸刻度
plt.yticks([-1, -0.5, 0, 0.5, 1]) # 設置 y 軸刻度plt.show()
4. 子圖布局
使用 subplot
可以在一個圖形中創建多個子圖:
plt.figure(figsize=(12, 8))# 創建 2x2 布局的子圖
plt.subplot(2, 2, 1) # 第一行第一列
plt.plot(x, np.sin(x))
plt.title('sin(x)')plt.subplot(2, 2, 2) # 第一行第二列
plt.plot(x, np.cos(x), 'g-')
plt.title('cos(x)')plt.subplot(2, 2, 3) # 第二行第一列
plt.plot(x, np.sin(x) * np.cos(x), 'r-')
plt.title('sin(x)·cos(x)')plt.subplot(2, 2, 4) # 第二行第二列
plt.plot(x, np.sin(x) + np.cos(x), 'm-')
plt.title('sin(x)+cos(x)')plt.tight_layout() # 自動調整子圖參數,使之填充整個圖像區域
plt.show()
四、練習:可視化銷售數據趨勢
現在,讓我們應用所學知識,創建一個銷售數據可視化案例。
1??準備數據
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib.ticker import StrMethodFormatter# 設置中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 生成銷售數據
np.random.seed(42) # 設置隨機種子,確保結果可重現# 創建月份數據
months = pd.date_range(start='2023-01-01', periods=12, freq='ME')
month_labels = [m.strftime('%Y-%m') for m in months]# 創建三種產品的銷售數據
product_A = np.random.randint(100, 200, size=12) * (1 + np.sin(np.linspace(0, 2*np.pi, 12)) * 0.2)
product_B = np.random.randint(150, 250, size=12) * (1 + np.cos(np.linspace(0, 2*np.pi, 12)) * 0.1)
product_C = np.random.randint(80, 180, size=12) * (1 + 0.05 * np.arange(12)) # 線性增長趨勢# 創建 DataFrame
sales_data = pd.DataFrame({'月份': month_labels,'產品A': product_A,'產品B': product_B,'產品C': product_C
})# 計算總銷售額
sales_data['總銷售額'] = sales_data['產品A'] + sales_data['產品B'] + sales_data['產品C']print(sales_data.head())
輸出結果:
2??繪制銷售趨勢圖表
# 設置繪圖樣式
plt.style.use('seaborn-v0_8-whitegrid')# 創建一個大畫布,包含多個子圖
plt.figure(figsize=(15, 10))# 1. 繪制各產品月度銷售趨勢折線圖
plt.subplot(2, 2, 1)
plt.plot(sales_data['月份'], sales_data['產品A'], 'o-', label='產品A', linewidth=2)
plt.plot(sales_data['月份'], sales_data['產品B'], 's-', label='產品B', linewidth=2)
plt.plot(sales_data['月份'], sales_data['產品C'], '^-', label='產品C', linewidth=2)plt.title('各產品月度銷售趨勢', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('銷售額', fontsize=12)
plt.xticks(rotation=45) # 旋轉 x 軸標簽,防止重疊
plt.legend()
plt.grid(True)# 2. 繪制總銷售額柱狀圖
plt.subplot(2, 2, 2)
bars = plt.bar(sales_data['月份'], sales_data['總銷售額'], color='skyblue', edgecolor='navy')# 為柱狀圖添加數值標簽
for bar in bars:height = bar.get_height()plt.text(bar.get_x() + bar.get_width()/2., height + 5,f'{int(height)}',ha='center', va='bottom', fontsize=9)plt.title('月度總銷售額', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('銷售額', fontsize=12)
plt.xticks(rotation=45)
plt.gca().yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}')) # 設置 y 軸格式# 3. 繪制每月各產品銷售占比(堆疊柱狀圖)
plt.subplot(2, 2, 3)
bottom = np.zeros(12) # 初始底部位置for product, color in zip(['產品A', '產品B', '產品C'], ['#5DA5DA', '#FAA43A', '#60BD68']):plt.bar(sales_data['月份'], sales_data[product], bottom=bottom, label=product, color=color, alpha=0.8)bottom += sales_data[product] # 更新底部位置plt.title('月度產品銷售比例', fontsize=14)
plt.xlabel('月份', fontsize=12)
plt.ylabel('銷售額', fontsize=12)
plt.xticks(rotation=45)
plt.legend()# 4. 繪制三種產品總銷售額占比(餅圖)
plt.subplot(2, 2, 4)
product_totals = [sales_data['產品A'].sum(), sales_data['產品B'].sum(), sales_data['產品C'].sum()]
labels = ['產品A', '產品B', '產品C']
colors = ['#5DA5DA', '#FAA43A', '#60BD68']
explode = (0.05, 0, 0) # 突出顯示產品Aplt.pie(product_totals, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90, explode=explode, shadow=True)
plt.axis('equal') # 保證餅圖是圓的
plt.title('各產品銷售總額占比', fontsize=14)# 調整布局
plt.tight_layout()
plt.savefig('sales_analysis.png', dpi=300, bbox_inches='tight') # 保存圖表
plt.show()
輸出結果:
3??分析與總結
通過上面的可視化圖表,我們可以清晰地看到:
- 銷售趨勢:折線圖展示了各產品每月的銷售變化趨勢,可以觀察到季節性波動和長期趨勢。
- 銷售規模:柱狀圖直觀地展示了每月的總銷售額,便于比較不同月份的銷售表現。
- 產品結構:堆疊柱狀圖展示了每月各產品的銷售構成,餅圖則展示了全年各產品的銷售比例。
這種綜合性的可視化方式,可以幫助我們從多個角度分析銷售數據,發現潛在的商業機會和挑戰。
五、總結與拓展
1. 核心知識點回顧
在本文中,我們學習了:
- `Matplotlib 的基本概念`:包括其架構、用途和導入方式
- `基本圖表類型`:如何創建折線圖、柱狀圖和餅圖
- `圖形美化技巧`:如何添加標題、標簽、圖例,以及調整顏色、樣式和網格
- `實戰應用`:如何將多種圖表類型組合使用,進行綜合性的數據可視化
2. 進階技巧
如果你想進一步提升 Matplotlib 可視化技能,可以探索以下內容:
- 更多圖表類型:如散點圖、直方圖、箱線圖、熱力圖等
- 3D 繪圖:使用
mplot3d
工具包創建三維圖表 - 交互式圖表:結合
ipywidgets
創建交互式可視化 - 動畫:使用
animation
模塊創建動態圖表 - 與 Pandas 結合:使用 Pandas 的
plot()
方法,簡化數據可視化流程
3. 學習資源推薦
- 官方文檔:Matplotlib 官方文檔
- 圖例集:Matplotlib 圖例集
- 在線教程:Datacamp、Coursera 上的 Python 數據可視化課程
- 書籍:《Python for Data Analysis》和《Python Data Science Handbook》
在下一篇文章中,我們將探索另一個強大的可視化庫 Seaborn,它基于 Matplotlib 構建,提供了更高級的統計圖表和更優雅的默認樣式。
關鍵詞:Python, Matplotlib, 數據可視化, 繪圖, 折線圖, 柱狀圖, 餅圖, 圖表美化, CSDN Python教程
練習題:
- 嘗試結合 Pandas 和 Matplotlib,可視化一個包含多個變量的真實數據集(如氣溫、股票價格等)。
- 創建一個包含 4 個子圖的畫布,分別用不同類型的圖表展示同一數據集的不同特征。
- 探索 Matplotlib 的顏色映射(colormap)功能,嘗試使用不同的顏色方案來增強可視化效果。
希望這篇文章能幫助你掌握 Matplotlib 的基礎知識,開始創建引人注目的數據可視化作品,如有問題,歡迎在評論區留言交流!
創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊)
如果你對今天的內容有任何問題,或者想分享你的學習心得,歡迎在評論區留言討論!