Python matplotlib的spines模塊實例詳解
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()
方法獲取figure
的axes
對象,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模塊詳解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python Matplotlib繪圖基礎詳細教程
- Python matplotlib繪圖詳解
- 詳解Python中matplotlib模塊的繪圖方式
- matplotlib繪制正餘弦曲線圖的實現
- 基於python,Matplotlib繪制函數的等高線與三維圖像