首頁 > 軟體

Python matplotlib的spines模組範例詳解

2022-08-02 18:02:55

spines 模組詳解

matplotlib 設計了一個 spines模組,用於在建立 axes 時生成 Spine物件(座標軸線)。

spines模組定義了一個 Spine 類,為類定義了 25 個方法,其中有 3 個是 classmethod。

Spine 類

Spine 類的定義

一個 axis spine – 標註資料區域邊界的 line。

Spines 是連線 axis tick 標記的直線,並且標註資料區域的邊界。可以通過 set_position 將它放置在任意的位置。

預設的位置是:('outward', 0)

Spines 是 Patch的子類,並且繼承了Patch的大多數行為。

Spines 繪製 a line, a circle, 或者 an arc,取決於呼叫了 set_patch_line, set_patch_circle, or set_patch_arc 中的哪一個。預設是 Line。

class matplotlib.spines.Spine(axes, spine_type, path, **kwargs)

基礎類別:matplotlib.patches.Patch

Spine 類引數

axesAxes

容納該 Spine 的 Axes 範例。

spine_type

str, spine 的型別,‘left’/‘right’/‘top’/‘bottom’/‘circle’。

spine 的型別分為兩大類:

  • 直線型的,包括 ‘left’/‘right’/‘top’/‘bottom’;
  • ‘circle’ 型別, 包括 arc, circle;

path

用於繪製該 spine 的 Path 範例。

注意:

  • Spine 本質就是一條線。用於連線 axis 的 tick,並標記資料區域。
  • Spine 首先是為 _axes 子包在建立 Axes 時提供建立 axis spine 的工具。
  • 更重要的用途是提供了一系列方法供一般使用者設定、控制 axes 的 axis spines 的外觀和行為。
  • 為 axes 建立附加的 axis,或稱之為"寄生軸"提供工具。

我們只能設定讓 Axes 的預設 axis Spines 不可見,不能真的刪除 axes 自動建立的 axis spines 物件。

建立 Spine 物件的範例

範例化 matplotlib.spines.Spine 類即建立一個 Spine 物件,axes, spine_type, path 是必需引數。

spine_type'left'/'right'/'top'/'bottom'之一,即直線型別時, path 只能是兩個 vertices。理由很簡單,兩點決定一條直線。

直線型別的 spine 預設的長度由 axes 的資料邊界決定。

建立直線型 Spine 並新增到 axes

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine

fig = plt.figure(figsize=(6.4,4.8))
ax = plt.axes(polar=False)

x = np.linspace(-1, 1., 100)
ax.plot(x, np.sin(x*np.pi))

path = Path([(0,0),(0.2,0.0)]) #兩個頂點的 path, 
# 否則會出發宣告錯誤 AssertionError: unexpected vertices shape
spine = Spine(ax, 'right',path)
spine.set_color('r')

ax.add_patch(spine)

plt.savefig('spines131.png',facecolor='w')

plt.show()

spine_type=‘circle’

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine

fig = plt.figure(figsize=(6.4,4.8))
ax = plt.axes(polar=False)

x = np.linspace(-1, 1., 100)
ax.plot(x, np.sin(x*np.pi))

path = Path([(-0.75,-0.75),(-0.25,0.5),(0.2,0.05),(0,-0.25)]) 

# path 的 vertices >=3 時,spine_type 只能是 'circle'
spine = Spine(ax, 'circle',path)
spine.set_color('r')

#set_patch_arc(self, center, radius, theta1, theta2)
#set_patch_circle(self, center, radius)

#set_patch_arc, circle, 的引數會覆蓋 path 的引數定義
spine.set_patch_arc((0.25,0.25),0.4,15,75)

ax.add_patch(spine)

plt.savefig('spines132.png',facecolor='w')

plt.show()

預設的 Spine 物件的儲存和呼叫

在 matplotlib, 建立 axes 時自動建立的 spines 被儲存在一個 OrderDict 中。即使設定 axis 不可見,axes.Spines 物件依然存在。

Axes 的 projection 不同, OrderDict 的 keys 也不同:

  • 笛卡爾座標系的 OrderDict.keys() = odict_keys([‘left’, ‘right’, ‘bottom’, ‘top’])
  • polar 座標系的 OrderDict.keys() = odict_keys([‘polar’, ‘start’, ‘end’, ‘inner’])

在matplotlib的圖中,可以通過ax = plt.gca()方法獲取figureaxes物件,gca‘get current axes’的縮寫。axes預設有四個 Spine物件,兩個橫軸和兩個豎軸,分別是 top、bottom、left、right

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(9.6,4.8))

ax = plt.subplot(121)
ax = plt.subplot(122, projection='polar')

N = 100
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=True)

ax.plot(theta,theta/6,'--',lw=2)
ax.plot(theta,theta/6,'--',lw=2)

print(plt.gca()) #返回當前 axes,如果需要則建立一個

print(ax.spines.keys())
print(ax.spines.keys())

plt.savefig('spines21.png',facecolor='w',dpi=200)
plt.show()
PolarAxesSubplot(0.547727,0.125;0.352273x0.755)
odict_keys(['left', 'right', 'bottom', 'top'])
odict_keys(['polar', 'start', 'end', 'inner'])

print(ax.spines)
OrderedDict([('left', <matplotlib.spines.Spine object at 0x000001C6228F11C0>), ('right', <matplotlib.spines.Spine object at 0x000001C6228F1C40>), ('bottom', <matplotlib.spines.Spine object at 0x000001C6228F1BB0>), ('top', <matplotlib.spines.Spine object at 0x000001C6228E7F10>)])

可以通過 axes.Spines['key'] 來獲取 axes.spines 中的單個物件,並設定它的屬性。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine

fig = plt.figure(figsize=(6.4,4.8))
ax = plt.axes(polar=False)

x = np.linspace(-1, 1., 100)
ax.plot(x, np.sin(x*np.pi))

ax.spines['left'].set_color('r') #left's Spine 設定為紅色
ax.spines['left'].set_linewidth(5) #left's 線寬
ax.spines['top'].set_visible(False) #top's Spine 不可見

print(ax.spines['bottom']) # axes.spines['key']返回的是 Spine 範例

plt.savefig('spines22.png',facecolor='w')

plt.show()

Spine

Spine 物件的方法

對於一般使用者,最重要的就是 spine.set_方法:

  • set_position()
  • set_color()
  • set_bounds()
  • set_patch_arc()
  • set_patch_circle()
  • set_pathc_line()

set_position(self, position)

設定 spine 物件的位置。

position 通過 (position type, amount) 元組定義。

position types 有:

  • ‘outward’: 將 spine 從資料區移出指定的點數。(負值是指 spine inwards。)
  • ‘axes’: 將 spine 放到定義的 Axes 座標系中,(0, 1)
  • ‘data’: 將 spine 放到定義的 data 座標系中。

此外,速記符號定義了特殊的位置:

  • ‘center’ -> (‘axes’, 0.5)
  • ‘zero’ -> (‘data’, 0.0)

移動 axis 到 (0, 0) 位置

aimport matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine

fig = plt.figure(figsize=(9.6,4.8))

ax = plt.subplot(121)
ax2 = plt.subplot(122)


x = np.linspace(-1, 1., 100)
ax.plot(x, np.sin(x*np.pi))
ax2.plot(x, np.sin(x*np.pi),c='r')

# 移動 left 和 bottom spines 到 (0,0) 位置
ax.spines["left"].set_position(("data", 0))
ax.spines["bottom"].set_position(("data", 0))
# 隱藏 top 和 right spines.
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)

ax.plot(1, 0, ">k", transform=ax.get_yaxis_transform(), clip_on=False)
ax.plot(0, 1, "^k", transform=ax.get_xaxis_transform(), clip_on=False)

plt.savefig('spines32.png',facecolor='w')

plt.show()

set_bounds()

set_bounds(*self*, *low=None*, *high=None*)

設定 spine 的邊界。

Parameters:

low

float or None, optional

spine 的下界。傳遞 None,保留原 limit 不改變。

也可以在第一個位置引數傳遞 (low, high) tuple.

high

float or None, optional

spine 的上界。傳遞 None,保留原 limit 不改變。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(19680801)

x = np.linspace(0, 2*np.pi, 50)
y = np.sin(x)

fig, ax = plt.subplots()
ax.plot(x, y)

ax.set_xlim((0, 2*np.pi))
ax.set_xticks([0, np.pi, 2*np.pi])
ax.set_xticklabels(['0', r'$pi$', r'2$pi$'])
ax.set_ylim((-1.5, 1.5))
ax.set_yticks([-1, 0, 1])

ax.spines['left'].set_bounds((-1, 1))

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.savefig('spines33.png',facecolor='w')

plt.show()

用法範例

建立多個 yaxis

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine
import random


fig, host = plt.subplots(figsize=(6.4,4.8),tight_layout=True)
parasite1 = host.twinx()
parasite2 = host.twinx()

x = np.arange(0, 3,0.25)

parasite2.spines["right"].set_position(("axes", 1.2))

parasite2.spines["right"].set_visible(True)

p1, = host.plot(x, x*np.sin(x), "b-")
p2, = parasite1.plot(x, x**2*np.sin(x), "r--")
p3, = parasite2.plot(x, x*np.sin(x)*25, "g-.")


host.set_xlim(0, 2)
host.set_ylim(0, 2)
parasite1.set_ylim(0, 4)
parasite2.set_ylim(1, 65)


tkw = dict(size=4, width=1.5)
host.tick_params(axis='y', colors=p1.get_color(),**tkw)
parasite1.tick_params(axis='y', colors=p2.get_color(),**tkw)
parasite2.tick_params(axis='y', colors=p3.get_color(),**tkw)
host.tick_params(axis='x',**tkw)

plt.savefig('spines41.png',facecolor='w')

plt.show()

偏移 axis

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine

fig = plt.figure(figsize=(9.6,4.8))

# 灰色的矩形區域是 Axes 區域
ax = plt.subplot(121,facecolor=[0.85,0.85,0.85])
ax2 = plt.subplot(122,facecolor=[0.85,0.85,0.85])

x = np.linspace(-1, 1., 100)
ax.plot(x, np.sin(x*np.pi))
ax2.plot(x, np.sin(x*np.pi),c='r')

# 偏移 ax 的 left 和 bottom spines outward 20 points
# 預設的 axis 是緊貼 axes 的
ax.spines['left'].set_position(('outward', 20))
ax.spines['bottom'].set_position(('outward', 20))

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.savefig('spines42.png',facecolor='w')

plt.show()

多 vertices 的 path

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spine

fig = plt.figure(figsize=(6.4,4.8))
ax = plt.axes(polar=False)

path_data = [
    (0.018, -0.11),
    (-0.031, -0.051),
    (-0.115, 0.073),
    (-0.03, 0.073),
    (-0.011, 0.039),
    (0.043, 0.121),
    (0.075, -0.005),
    (0.035, -0.027),
    (0.018, -0.11)]

path = Path(path_data)

x = np.linspace(-1, 1., 100)
ax.plot(x, np.sin(x*np.pi)/7)

spine = Spine(ax, spine_type='circle', path=path)

ax.add_patch(spine)
spine.set_color('r')
spine.register_axis(ax.xaxis)

plt.savefig('spine43.png',facecolor='w')

plt.show()

axis 是連線 ticks 的線,我們已經可以控制 axis 的 spine,下一篇開始將討論 ticks 物件。

總結

到此這篇關於Python matplotlib的spines模組的文章就介紹到這了,更多相關matplotlib spines模組詳解內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com