本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以下文章來源于Trochil蜂鳥資料 ,作者 蜂鳥資料Trochil
一圖勝千言,使用Python的matplotlib庫,可以快速創建高質量的圖形,
我們團隊推出一個新的系列教程:Python資料可視化,針對初級和中級用戶,將理論和示例代碼相結合,使用matplotlib, seaborn, plotly等工具實作可視化,
本文的主題是如何用Matplotlib創建子圖,
Matplotlib有一個概念subplot:包含在Figure物件中的小型Axes物件,這允許我們在一幅圖中創建很多個子圖,方便對比資料,
創建子圖的3種常用方法:
- fig.add_axes
- plt.subplots
- plt.GridSpec
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlineplt.style.use("ggplot")
1. fig.add_axes
- 先呼叫plt.figure()創建Figure物件,圖表是所有坐標的容器,
- 呼叫fig.add_axes()在圖表的任意位置添加子圖,該方法接收一個包含4個數字的串列: $[x, y, width, height]$,分別代表子圖左下角的坐標(x,y),子圖的寬度和高度,這四個數字的取值范圍都是$[0,1]$,代表相對位置和大小,
- 最后呼叫ax.plot將資料映射到子圖,
# 創建圖表物件
fig = plt.figure(figsize=(10, 7))
# 創建子圖ax1 = fig.add_axes([0, 0.5, 0.45, 0.45]) # 在圖表的左上角創建一個子圖
ax2 = fig.add_axes([0.5, 0, 0.45, 0.45]) # 在圖表的右下方創建一個子圖
# 左上角子圖:曲線圖x1 = np.linspace(-10, 10, 100)
ax1.plot(x1, np.sin(x1), color="red")
# 右下角子圖:柱狀圖x2 = ["a", "b", "c", "d", "e", "f"]
y2 = [1.2, 1.3, 2.5, 0.25, 5, 1.56]
ax2.bar(x2, y2, color="blue")
2. plt.subplots
plt.subplots用于快速創建多個子圖,這些子圖會以網格狀排列,函式回傳長度為2的元組,第一個元素是Figure物件,第二個元素是坐標集合,
# 創建一個圖形物件,拆分為2*3的網格,包含6個坐標物件
fig, axes = plt.subplots( nrows=2, # 定義行數
ncols=3, # 定義列數
sharex=True, # 是否共享x軸坐標 sharey=True, # 是否共享y軸坐標 figsize=(10, 7) # 影像大小
)# axes是2*3的numpy陣列,可根據[row, col]索引獲取單個坐標物件
# print(type(axes))
# print(axes)
for i in range(2):
for j in range(3):
axes[i, j].text(0.5, 0.5, str((i, j)), ha="center", fontsize=15)
3. plt.GridSpec
上面的案例創建了規則排列的子圖(網格狀),但有時候想創建不規則的子圖,部分子圖更大,展示核心資訊,有的子圖較小,展現輔助資訊,
plt.GridSpec可實作這一點,作業原理是先創建一個網格狀的藍圖,然后合并部分子圖(類似于Excel中合并單元格的操作),
- 呼叫plt.GridSpec創建網格狀的藍圖
- 通過切片和索引按需求'合并'子圖
- 呼叫ax.plot()將資料映射到圖表
# 創建圖表物件
fig = plt.figure(figsize=(10, 7))
# 創建2*3的'網格'藍圖
grid = plt.GridSpec(nrows=2, ncols=3, figure=fig)
# 網格物件可索引和切片,根據網格物件可創建坐標物件for row in range(2):
for col in range(3):
ax = plt.subplot(grid[row, col]) ax.text(0.5, 0.5, str((row, col)), ha="center", fontsize=15)
# 至此的效果跟plt.subplots相同,接下來我們展示如何合并子圖
# 創建圖表物件
fig = plt.figure(figsize=(10, 7))
# 創建2*3的'網格'藍圖
grid = plt.GridSpec(nrows=2, ncols=3, figure=fig)
# 合并子圖ax1 = plt.subplot(grid[0, 0])
ax2 = plt.subplot(grid[0, 1:]) # 合并(0,1)和(0,2)位置的子圖
ax3 = plt.subplot(grid[1, 0:2]) # 合并(1,0)和(1,1)位置的子圖
ax4 = plt.subplot(grid[1, 2])
x = np.linspace(0, 10, 30)
ax1.plot(x, np.sin(x), "-r")
ax2.plot(x, np.cos(x), "-ob")
ax3.plot(x, np.sin(x + 10), "-oy")
ax4.plot(x, np.cos(x + 10), "-g")
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/400.html
標籤:Python
