『Python』matplotlib共享繪圖區域坐標軸


1. 共享單一繪圖區域的坐標軸

有時候,我們想將多張圖形放在同一個繪圖區域,不想在每個繪圖區域只繪制一幅圖形。這時候,就可以借助共享坐標軸的方法實現在一個繪圖區域繪制多幅圖形的目的。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.use('Qt5Agg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題,或者轉換負號為字符串

fig, ax1 = plt.subplots()

t = np.arange(0.05, 10., 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, c="b", ls="-")

ax1.set_xlabel("x坐標軸")
ax1.set_ylabel("以e為底的指數", color="b")
ax1.tick_params("y", colors="b")

ax2 = ax1.twinx()
s2 = np.cos(t ** 2)
ax2.plot(t, s2, c="r", ls=":")

ax2.set_ylabel("余弦函數", color="r")
ax2.tick_params("y", colors="r")

plt.show()

同樣可以用twiny()方法共享y軸

2. 共享不同子區繪圖區域的坐標軸

subplots()函數有兩個命名關鍵字參數sharexsharey,有四種取值

  • 'row'
  • 'col'
  • 'all',等同於True
  • 'none',等同於False
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.use('Qt5Agg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題,或者轉換負號為字符串

x1 = np.linspace(0, 2 * np.pi, 400)
y1 = np.cos(x1 ** 2)

x2 = np.linspace(0.01, 10, 100)
y2 = np.sin(x2)

x3 = np.random.rand(100)
y3 = np.linspace(0, 3, 100)

x4 = np.arange(0, 6, 0.5)
y4 = np.power(x4, 3)

fig, ax = plt.subplots(2, 2)

ax1 = ax[0, 0]
ax1.plot(x1, y1)

ax2 = ax[0, 1]
ax2.plot(x2, y2)

ax3 = ax[1, 0]
ax3.scatter(x3, y3)

ax4 = ax[1, 1]
ax4.scatter(x4, y4)

plt.show()

基本圖形如圖所示:

  • sharex='all'
  • sharex='none'
  • sharex='row'
  • sharex='col'

sharey類似

將共享坐標軸的子區之間的空隙去掉

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.use('Qt5Agg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題,或者轉換負號為字符串

x1 = np.linspace(0, 2 * np.pi, 400)
y1 = np.cos(x1 ** 2)

x2 = np.linspace(0.01, 10, 100)
y2 = np.sin(x2)

x3 = np.random.rand(100)
y3 = np.linspace(0, 3, 100)

x4 = np.arange(0, 6, 0.5)
y4 = np.power(x4, 3)

fig, ax = plt.subplots(2, 2, sharex='all', sharey='all')
fig.subplots_adjust(hspace=0, wspace=0)

ax1 = ax[0, 0]
ax1.plot(x1, y1)

ax2 = ax[0, 1]
ax2.plot(x2, y2)

ax3 = ax[1, 0]
ax3.scatter(x3, y3)

ax4 = ax[1, 1]
ax4.scatter(x4, y4)

plt.show()

3. 共享個別子區繪圖區域的坐標軸

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.use('Qt5Agg')
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False  # 解決保存圖像是負號'-'顯示為方塊的問題,或者轉換負號為字符串

x1 = np.linspace(0, 2 * np.pi, 400)
y1 = np.cos(x1 ** 2)

x2 = np.linspace(0.01, 10, 100)
y2 = np.sin(x2)

x3 = np.random.rand(100)
y3 = np.linspace(0, 3, 100)

x4 = np.arange(0, 6, 0.5)
y4 = np.power(x4, 3)

fig, ax = plt.subplots(2, 2)

ax1 = plt.subplot(221)
ax1.plot(x1, y1)

ax2 = plt.subplot(222)
ax2.plot(x2, y2)

ax3 = plt.subplot(223)
ax3.scatter(x3, y3)

ax4 = plt.subplot(224, sharex=ax1)
ax4.scatter(x4, y4)

plt.show()

4. 優化坐標軸范圍顯示

plt.autoscale(enable=True, axis="both", tight=True)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM