Python?matplotlib的spines模塊實(shí)例詳解
spines 模塊詳解
matplotlib 設(shè)計(jì)了一個(gè) spines模塊,用于在創(chuàng)建 axes 時(shí)生成 Spine對(duì)象(坐標(biāo)軸線)。
spines模塊定義了一個(gè) Spine 類(lèi),為類(lèi)定義了 25 個(gè)方法,其中有 3 個(gè)是 classmethod。
Spine 類(lèi)
Spine 類(lèi)的定義
一個(gè) axis spine – 標(biāo)注數(shù)據(jù)區(qū)域邊界的 line。
Spines 是連接 axis tick 標(biāo)記的直線,并且標(biāo)注數(shù)據(jù)區(qū)域的邊界。可以通過(guò) set_position
將它放置在任意的位置。
默認(rèn)的位置是:('outward', 0)
。
Spines 是 Patch
的子類(lèi),并且繼承了Patch
的大多數(shù)行為。
Spines 繪制 a line, a circle, 或者 an arc,取決于調(diào)用了 set_patch_line
, set_patch_circle
, or set_patch_arc
中的哪一個(gè)。默認(rèn)是 Line。
class matplotlib.spines.Spine(axes, spine_type, path, **kwargs)
基類(lèi):matplotlib.patches.Patch
Spine 類(lèi)參數(shù)
axesAxes
容納該 Spine 的 Axes
實(shí)例。
spine_type
str, spine 的類(lèi)型,‘left’/‘right’/‘top’/‘bottom’/‘circle’。
spine 的類(lèi)型分為兩大類(lèi):
- 直線型的,包括 ‘left’/‘right’/‘top’/‘bottom’;
- ‘circle’ 類(lèi)型, 包括 arc, circle;
path
用于繪制該 spine 的 Path
實(shí)例。
注意:
- Spine 本質(zhì)就是一條線。用于連接 axis 的 tick,并標(biāo)記數(shù)據(jù)區(qū)域。
- Spine 首先是為 _axes 子包在創(chuàng)建 Axes 時(shí)提供創(chuàng)建 axis spine 的工具。
- 更重要的用途是提供了一系列方法供一般用戶設(shè)置、控制 axes 的 axis spines 的外觀和行為。
- 為 axes 創(chuàng)建附加的 axis,或稱之為"寄生軸"提供工具。
我們只能設(shè)置讓 Axes 的默認(rèn) axis Spines 不可見(jiàn),不能真的刪除 axes 自動(dòng)創(chuàng)建的 axis spines 對(duì)象。
創(chuàng)建 Spine 對(duì)象的實(shí)例
實(shí)例化 matplotlib.spines.Spine
類(lèi)即創(chuàng)建一個(gè) Spine 對(duì)象,axes, spine_type, path
是必需參數(shù)。
spine_type
是 'left'/'right'/'top'/'bottom'
之一,即直線類(lèi)型時(shí), path
只能是兩個(gè) vertices。理由很簡(jiǎn)單,兩點(diǎn)決定一條直線。
直線類(lèi)型的 spine 默認(rèn)的長(zhǎng)度由 axes 的數(shù)據(jù)邊界決定。
創(chuàng)建直線型 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)]) #兩個(gè)頂點(diǎn)的 path, # 否則會(huì)出發(fā)聲明錯(cuò)誤 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 時(shí),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, 的參數(shù)會(huì)覆蓋 path 的參數(shù)定義 spine.set_patch_arc((0.25,0.25),0.4,15,75) ax.add_patch(spine) plt.savefig('spines132.png',facecolor='w') plt.show()
默認(rèn)的 Spine 對(duì)象的存儲(chǔ)和調(diào)用
在 matplotlib, 創(chuàng)建 axes 時(shí)自動(dòng)創(chuàng)建的 spines 被保存在一個(gè) OrderDict
中。即使設(shè)置 axis 不可見(jiàn),axes.Spines 對(duì)象依然存在。
Axes 的 projection 不同, OrderDict 的 keys 也不同:
- 笛卡爾坐標(biāo)系的 OrderDict.keys() = odict_keys([‘left’, ‘right’, ‘bottom’, ‘top’])
- polar 坐標(biāo)系的 OrderDict.keys() = odict_keys([‘polar’, ‘start’, ‘end’, ‘inner’])
在matplotlib的圖中,可以通過(guò)ax = plt.gca()
方法獲取figure
的axes
對(duì)象,gca
是‘get current axes’
的縮寫(xiě)。axes
默認(rèn)有四個(gè) Spine
對(duì)象,兩個(gè)橫軸和兩個(gè)豎軸,分別是 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()) #返回當(dāng)前 axes,如果需要?jiǎng)t創(chuàng)建一個(gè) 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>)])
可以通過(guò) axes.Spines['key']
來(lái)獲取 axes.spines 中的單個(gè)對(duì)象,并設(shè)置它的屬性。
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 設(shè)置為紅色 ax.spines['left'].set_linewidth(5) #left's 線寬 ax.spines['top'].set_visible(False) #top's Spine 不可見(jiàn) print(ax.spines['bottom']) # axes.spines['key']返回的是 Spine 實(shí)例 plt.savefig('spines22.png',facecolor='w') plt.show()
Spine
Spine 對(duì)象的方法
對(duì)于一般用戶,最重要的就是 spine.set_
方法:
- set_position()
- set_color()
- set_bounds()
- set_patch_arc()
- set_patch_circle()
- set_pathc_line()
set_position(self, position)
設(shè)置 spine 對(duì)象的位置。
position
通過(guò) (position type, amount)
元組定義。
position types
有:
- ‘outward’: 將 spine 從數(shù)據(jù)區(qū)移出指定的點(diǎn)數(shù)。(負(fù)值是指 spine inwards。)
- ‘axes’: 將 spine 放到定義的 Axes 坐標(biāo)系中,
(0, 1)
- ‘data’: 將 spine 放到定義的 data 坐標(biāo)系中。
此外,速記符號(hào)定義了特殊的位置:
- ‘center’ -> (‘axes’, 0.5)
- ‘zero’ -> (‘data’, 0.0)
移動(dòng) 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') # 移動(dòng) 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*)
設(shè)置 spine 的邊界。
Parameters:
low
float or None, optional
spine 的下界。傳遞 None,保留原 limit 不改變。
也可以在第一個(gè)位置參數(shù)傳遞 (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()
用法示例
創(chuàng)建多個(gè) 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)) # 灰色的矩形區(qū)域是 Axes 區(qū)域 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 # 默認(rèn)的 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 的線,我們已經(jīng)可以控制 axis 的 spine,下一篇開(kāi)始將討論 ticks 對(duì)象。
總結(jié)
到此這篇關(guān)于Python matplotlib的spines模塊的文章就介紹到這了,更多相關(guān)matplotlib spines模塊詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息
這篇文章主要介紹了Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python實(shí)現(xiàn)快速計(jì)算24點(diǎn)游戲的示例代碼
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)快速計(jì)算24點(diǎn)游戲并獲取表達(dá)式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12一文教你用Python中progress庫(kù)實(shí)現(xiàn)進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python中的progress庫(kù)實(shí)現(xiàn)進(jìn)度條的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03Python實(shí)現(xiàn)刪除Android工程中的冗余字符串
這篇文章主要介紹了Python實(shí)現(xiàn)刪除Android工程中的冗余字符串,本文實(shí)現(xiàn)的是刪除Android資源(語(yǔ)言)國(guó)際化機(jī)制中的一些冗余字符串,需要的朋友可以參考下2015-01-01利用Python將多張圖片合成視頻的實(shí)現(xiàn)
這篇文章主要介紹了利用Python將多張圖片合成視頻的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11