目錄
一、初識Matploblib
1.1 安裝 Matplotlib
1.2、Matplotlib 的兩種接口風格
1.3、Figure 和 Axes 的深度理解
1.4 設置畫布大小
1.5 設置網格線
1.6?設置坐標軸
1.7 設置刻度和標簽
1.8?添加圖例和標題
1.9 設置中文顯示
1.10 調整子圖布局
二、常用繪圖教程
2.1?折線圖?
2.2 散點圖
2.3?直方圖
2.4?餅圖
?編輯
一、初識Matploblib
Matplotlib是Python中的繪圖庫,類似于MATLAB,可以用來繪制各種靜態,動態,交互式的圖表。
1.1 安裝 Matplotlib
首先需要安裝 Matplotlib 庫:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
1.2、Matplotlib 的兩種接口風格
Matplotlib 提供了兩種主要使用方式,適用于不同場景:
pyplot 接口(類似 MATLAB 風格)
這種方式通過?plt
?模塊直接調用函數,自動管理圖形和子圖狀態,適合快速繪圖和簡單場景。
示例:
import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x)) # 自動創建figure和axes
plt.title("pyplot接口示例")
plt.show()
面向對象接口(OO 風格)
顯式創建?Figure
(畫布)和?Axes
(子圖)對象,通過對象方法操作,適合復雜繪圖(如多子圖、定制化布局)。
示例:
import matplotlib.pyplot as plt
import numpy as npfig, ax = plt.subplots() # 顯式創建figure和axes
ax.plot(x, np.sin(x))
ax.set_title("面向對象接口示例")
fig.show()
區別與選擇:簡單繪圖用 pyplot 更簡潔;復雜場景(如多子圖聯動、自定義坐標軸)必須用 OO 接口,可控性更強。
1.3、Figure 和 Axes 的深度理解
Figure(畫布)
- 整個繪圖窗口,是所有元素的容器。
- 可通過?
figsize=(width, height)
?控制大小(單位:英寸),dpi
?控制分辨率(默認 100)。
Axes(子圖)
一個 Figure 可包含多個 Axes(如 2×2 網格的子圖),每個 Axes 是一個獨立的繪圖區域。
1.4 設置畫布大小
在使用matplotlib作圖時,會遇到圖片顯示不全或者圖片大小不是我們想要的,這個時候就需要調整畫布大小。下例左圖為500*500像素,右圖為1000*1000像素。
import matplotlib.pyplot as plt# 500 x 500 像素(先寬度 后高度)
# 注意這里的寬度和高度的單位是英寸,1英寸=100像素
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(111)
plt.show()
1.5 設置網格線
通過?axes 對象提供的 grid() 方法可以開啟或者關閉畫布中的網格以及網格的主/次刻度。除此之外,grid() 函數還可以設置網格的顏色、線型以及線寬等屬性。
grid() 的函數使用格式如下
grid(color='b', ls = '-.', lw = 0.25)
參數含義如下:
- color:表示網格線的顏色;
- ls:表示網格線的樣式;
- lw:表示網格線的寬度;
網格在默認狀態下是關閉的,通過調用上述函數,網格會被自動開啟,如果只是想開啟不帶任何樣式的網格,可以通過 grid(True) 來實現。
實例如下:
import matplotlib.pyplot as plt
import numpy as np# fig畫布;axes子圖區域
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
x = np.arange(1, 11)
axes[0].plot(x, x ** 3, 'g', lw=2)
# 開啟網格
axes[0].grid(True)
axes[0].set_title('default grid')
axes[1].plot(x, np.exp(x), 'r')
# 設置網格的顏色,線型,線寬
axes[1].grid(color='b', ls='-.', lw=0.25)
axes[1].set_title('custom grid')
axes[2].plot(x, x)
axes[2].set_title('no grid')
fig.tight_layout()
plt.show()
1.6?設置坐標軸
set_xlabel
?用字符串列表來設置坐標軸的標簽,fontdict
?設置軸標簽的字體和字號等參數。
import matplotlib.pyplot as plt
import numpy as npfontdict = {'weight': 'normal', 'family': 'Times New Roman', 'size': 20}fig, axes = plt.subplots(1, 1)
x = np.arange(1, 5)
axes.plot(x, np.exp(x))
axes.plot(x, x ** 2)# 設置標題
axes.set_title("Normal scale", fontdict=fontdict)# 設置x、y軸標簽
axes.set_xlabel("x axis", fontdict=fontdict)
axes.set_ylabel("y axis", fontdict=fontdict)plt.show()
Matplotlib 可以根據自變量與因變量的取值范圍,自動設置 x 軸與 y 軸的數值大小。當然,您也可以用自定義的方式,通過 set_xlim() 和 set_ylim() 對 x、y 軸的數值范圍進行設置。
import matplotlib.pyplot as plt
import numpy as npfig, a1 = plt.subplots(1, 1)x = np.arange(1, 10)
a1.plot(x, np.exp(x), 'r')
a1.set_title('exp')
# 設置y軸
a1.set_ylim(0, 4000)
# 設置x軸
a1.set_xlim(0, 8)
plt.show()
1.7 設置刻度和標簽
刻度指的是軸上數據點的標記,Matplotlib 能夠自動的在 x 、y 軸上繪制出刻度。這一功能的實現得益于 Matplotlib 內置的刻度定位器和格式化器(兩個內建類)。在大多數情況下,這兩個內建類完全能夠滿足我們的繪圖需求,但是在某些情況下,刻度標簽或刻度也需要滿足特定的要求,比如將刻度設置為“英文數字形式”或者“大寫阿拉伯數字”,此時就需要對它們重新設置。
?
下面示例介紹了刻度和標簽的使用方法,其中對標簽逆時針旋轉了90°:
import matplotlib.pyplot as plt
import numpy as np
import mathx = np.arange(0, math.pi * 2, 0.05)fig, ax = plt.subplots(1, 1, figsize=(10, 6))y = np.sin(x)
ax.plot(x, y)
# 設置x軸標簽
ax.set_xlabel('angle')
# ax.set_title('sine')
ax.set_xticks([0, 2, 4, 6])
# 設置x軸刻度標簽,并旋轉90°
ax.set_xticklabels(['zero', 'two', 'four', 'six'], rotation=90)
# 設置y軸刻度
ax.set_yticks([-1, 0, 1])
plt.show()
1.8?添加圖例和標題
圖例通過ax.legend或者plt.legend()實現,標題通過ax.set_title()或者plt.title()實現,基本用法如下例所示。
import matplotlib as mplmpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = Falseimport matplotlib.pyplot as plt
import numpy as npfig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(-2 * np.pi, 2 * np.pi, 200)
y = np.sin(x)
y1 = np.cos(x)ax.plot(x, y, label=r"$\sin(x)$")
ax.plot(x, y1, label=r"$\cos(x)$")ax.legend(loc="best") # 顯示圖例,loc="best"表示自動選擇最佳位置放置圖例
ax.set_title("正弦函數和余弦函數的折線圖") # 設置圖表的標題
plt.show()
調整圖例
對于圖例,我們還可以通過改變legend()的參數來改變圖例的顯示位置,展示樣式(包括圖例的外邊框、圖例中的文本標簽的排列位置和圖例的投影效果等方面)。
import matplotlib.pyplot as plt
import numpy as npx = np.arange(0, 2.1, 0.1)
y = np.power(x, 3)
y1 = np.power(x, 2)
y2 = np.power(x, 1)plt.plot(x, y, ls="-", lw=2, label="$x^{3}$")
plt.plot(x, y1, c="r", ls="-", lw=2, label="$x^{2}$")
plt.plot(x, y2, c="y", ls="-", lw=2, label="$x^{1}$")plt.legend(loc="upper left", bbox_to_anchor=(0.05, 0.95),ncol=3, title="power function", shadow=True,fancybox=True)
plt.show()
loc="upper left"
:指定圖例的大致位置為左上角。這是一個初始參考位置,實際位置會結合bbox_to_anchor
參數進行調整。
bbox_to_anchor=(0.05, 0.95)
:這是一個關鍵參數,用于精確調整圖例的位置。它接收一個元組(x, y)
,其中的坐標是相對于圖表的整個繪圖區域(默認是 axes 坐標系,即左下角為 (0,0),右上角為 (1,1))。這里(0.05, 0.95)
表示圖例的左上角頂點位于繪圖區域水平方向 0.05(5%)、垂直方向 0.95(95%)的位置。
ncol=3
:設置圖例中標簽的列數為 3 列。如果圖例包含多個條目,它們會按 3 列的形式排列,使布局更合理。
title="power function"
:為圖例添加標題,標題內容為 “power function”,會顯示在圖例的上方。
shadow=True
:使圖例添加陰影效果,增強圖例的立體感和視覺層次感。
fancybox=True
:設置圖例的邊框為圓角矩形,而默認的是直角矩形。
?plt.legend()的位置參數loc也可以使用數字,其對應如下:
字符串 | 位置編號 | 位置表述 |
---|---|---|
best | 0 | 最佳位置 |
upper right | 1 | 右上角 |
upper left | 2 | 左上角 |
lower left | 3 | 右下角 |
lower right | 4 | 左下角 |
right | 5 | 右側 |
center left | 6 | 左側垂直居中 |
center right | 7 | 右側垂直居中 |
lower center | 8 | 下方水平居中 |
upper center | 9 | 上方水平居中 |
center | 10 | 正中間 |
1.9 設置中文顯示
Matplotlib 默認不支持中文字體,只支持 ASCII 字符,但中文標注更加符合中國人的閱讀習慣。
當直接使用中文時,Matplotlib 繪制的圖像會出現中文亂碼,如左圖所示。通過臨時重寫配置文件的方法,可以解決 Matplotlib 顯示中文亂碼的問題,代碼如下所示:
import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] = ["SimHei"] # 設置字體
plt.rcParams["axes.unicode_minus"] = False # 正常顯示負號
year = [2017, 2018, 2019, 2020]
people = [20, 40, 60, 70]
# 生成圖表
plt.plot(year, people)
plt.xlabel('年份')
plt.ylabel('人口')
plt.title('人口增長')
# 設置縱坐標刻度
plt.yticks([0, 20, 40, 60, 80])
# 設置填充選項:參數分別對應橫坐標,縱坐標,縱坐標填充起始值,填充顏色
plt.fill_between(year, people, 20, color='green')
# 顯示圖表
plt.show()
Windows字體中英文名稱對照
中文名稱 | 英文名稱 |
黑體 | SimHei |
微軟雅黑 | Microsoft YaHei |
微軟雅黑 | Microsoft YaHei |
新宋體 | NSimSun |
新細明體 | PMingLiU |
細明體 | MingLiU |
標楷體 | DFKai-SB |
仿宋 | FangSong |
楷體 | KaiTi |
仿宋_GB2312 | FangSong_GB2312 |
楷體_GB2312 | KaiTi_GB2312 |
1.10 調整子圖布局
在pyplot模塊中,調整子圖布局的函數主要用subplots_adjust
subplots_adjust函數的功能為調整子圖的布局參數。對于沒有設置的參數保持不變
?
用法:
matplotlib.pyplot.subplots_adjust(left=None, bottom=None, \
right=None, top=None, wspace=None, hspace=None)
參數:
left:所有子圖整體相對于圖像的左外邊距,距離單位為圖像寬度的比例(小數)。可選參數。浮點數。默認值為0.125。
right:所有子圖整體相對于圖像的右外邊距,距離單位為圖像寬度的比例(小數)。可選參數。浮點數。默認值為0.0。
bottom:所有子圖整體相對于圖像的下外邊距,距離單位為圖像高度的比例(小數)。可選參數。浮點數。默認值為0.11。
top:所有子圖整體相對于圖像的上外邊距,距離單位為圖像高度的比例(小數)。可選參數。浮點數。默認值為0.88。
wspace:子圖間寬度內邊距,距離單位為子圖平均寬度的比例(小數)。浮點數。默認值為0.2。
hspace:子圖間高度內邊距,距離單位為子圖平均高度的比例(小數)。可選參數。浮點數。默認值為0.2。
示例代碼:
import matplotlib.pyplot as plt# 原始間距配置
fig, ax = plt.subplots(3, 3)
print(vars(fig.subplotpars))
# 通過subplots_adjust()設置間距配置
plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=0.5, hspace=0.5)
print(vars(fig.subplotpars))
plt.show()
原始
修改間距后(wspace=0.5, hspace=0.5):
二、常用繪圖教程
2.1?折線圖?
plot()函數畫出一系列的點,并且用線將它們連接起來。
格式:
# 基礎折線圖代碼格式
plt.plot(x, # x軸數據(數組或列表)y, # y軸數據(數組或列表,與x長度相同)label='曲線名稱', # 曲線標簽,用于圖例顯示color='blue', # 線條顏色(支持名稱、十六進制碼等)linestyle='-', # 線型('-'實線、'--'虛線、':'點線等)linewidth=2, # 線條寬度(數值越大線越粗)marker='o', # 數據點標記('o'圓形、's'正方形等)markersize=5 # 數據點標記的大小
)
看下例子:
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"] # 設置字體
plt.rcParams["axes.unicode_minus"] = False # 正常顯示負號
# 生成數據
x = np.linspace(0, 10, 50) # 0到10之間的50個點
y = np.sin(x) # 計算正弦值# 繪制折線圖
plt.plot(x, y, color='blue', linewidth=2)# 基本標簽
plt.title('簡單折線圖')
plt.xlabel('X軸')
plt.ylabel('Y軸')# 顯示圖形
plt.show()
?如果需要展示多條線,只需再添加一行plt.plot(x, 其他數據, ...)
即可。
2.2 散點圖
只畫點,不用線連接起來。
基本格式:
plt.scatter(x, # x軸數據(數組或列表)y, # y軸數據(數組或列表,與x長度相同)s=50, # 散點大小(數值越大點越大)c='blue', # 散點顏色(支持名稱、數組映射等)marker='o', # 散點形狀('o'圓形、'+'加號等)alpha=0.7, # 透明度(0-1之間,值越小越透明)edgecolors='black', # 散點邊緣顏色label='數據點' # 數據標簽,用于圖例顯示
)
?示例:
import matplotlib.pyplot as plt
import numpy as npx = np.arange(10)
y = np.random.randn(10)
plt.scatter(x, y, color='red', marker='+')
plt.show()
2.3?直方圖
?直方圖用于統計數據出現的次數或者頻率,有多種參數可以調整,見下例:
import matplotlib.pyplot as plt
import numpy as np# 生成示例數據:1000個符合正態分布的隨機數
data = np.random.randn(1000)# 繪制直方圖
n, bins, patches = plt.hist(x=data, # 要繪制直方圖的數據bins=30, # 直方圖的分箱數量,越多越精細density=False, # 是否將直方圖歸一化為概率密度(總和為1)alpha=0.7, # 透明度,0-1之間color='skyblue', # 直方圖顏色edgecolor='black' # 直方圖邊框顏色
)# 添加標題和標簽
plt.title('正態分布數據直方圖', fontsize=14)
plt.xlabel('數值', fontsize=12)
plt.ylabel('頻數', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
2.4?餅圖
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"] # 設置字體
plt.rcParams["axes.unicode_minus"] = False # 正常顯示負號
labels = ['蘋果', '香蕉', '橙子', '葡萄', '草莓'] # 各部分標簽
sizes = [35, 25, 20, 15, 5] # 各部分占比
explode = (0.1, 0, 0, 0, 0) # 突出顯示特定部分(這里突出顯示第一個部分)# 繪制餅圖
plt.pie(x=sizes, # 餅圖各部分的數值(會自動計算占比)explode=explode, # 每個部分的偏移量,用于突出顯示labels=labels, # 各部分的標簽autopct='%1.1f%%', # 顯示百分比的格式shadow=True, # 是否添加陰影效果startangle=90, # 餅圖的起始角度(0表示從x軸正方向開始)colors=['red', 'yellow', 'orange', 'purple', 'pink'] # 各部分顏色
)# 設置餅圖為正圓形(默認可能為橢圓形)
plt.axis('equal')
# 添加標題
plt.title('水果銷售占比')
# 顯示圖形
plt.show()