溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python?matplotlib的spines模塊怎么使用

發(fā)布時(shí)間:2022-08-04 09:58:45 來源:億速云 閱讀:173 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Python matplotlib的spines模塊怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python matplotlib的spines模塊怎么使用”吧!

    spines 模塊詳解

    matplotlib 設(shè)計(jì)了一個(gè) spines模塊,用于在創(chuàng)建 axes 時(shí)生成 Spine對象(坐標(biāo)軸線)。

    spines模塊定義了一個(gè) Spine 類,為類定義了 25 個(gè)方法,其中有 3 個(gè)是 classmethod。

    Python?matplotlib的spines模塊怎么使用

    Spine 類

    Spine 類的定義

    一個(gè) axis spine – 標(biāo)注數(shù)據(jù)區(qū)域邊界的 line。

    Spines 是連接 axis tick 標(biāo)記的直線,并且標(biāo)注數(shù)據(jù)區(qū)域的邊界。可以通過 set_position 將它放置在任意的位置。

    默認(rèn)的位置是:('outward', 0)

    Spines 是 Patch的子類,并且繼承了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)

    基類:matplotlib.patches.Patch

    Spine 類參數(shù)

    axesAxes

    容納該 Spine 的 Axes 實(shí)例。

    spine_type

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

    spine 的類型分為兩大類:

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

    • ‘circle’ 類型, 包括 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 不可見,不能真的刪除 axes 自動(dòng)創(chuàng)建的 axis spines 對象。

    創(chuàng)建 Spine 對象的實(shí)例

    實(shí)例化 matplotlib.spines.Spine 類即創(chuàng)建一個(gè) Spine 對象,axes, spine_type, path 是必需參數(shù)。

    spine_type'left'/'right'/'top'/'bottom'之一,即直線類型時(shí), path 只能是兩個(gè) vertices。理由很簡單,兩點(diǎn)決定一條直線。

    直線類型的 spine 默認(rèn)的長度由 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()

    Python?matplotlib的spines模塊怎么使用

    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()

    Python?matplotlib的spines模塊怎么使用

    默認(rèn)的 Spine 對象的存儲(chǔ)和調(diào)用

    在 matplotlib, 創(chuàng)建 axes 時(shí)自動(dòng)創(chuàng)建的 spines 被保存在一個(gè) OrderDict 中。即使設(shè)置 axis 不可見,axes.Spines 對象依然存在。

    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的圖中,可以通過ax = plt.gca()方法獲取figureaxes對象,gca‘get current axes’的縮寫。axes默認(rèn)有四個(gè) Spine對象,兩個(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'])

    Python?matplotlib的spines模塊怎么使用

    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 中的單個(gè)對象,并設(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 不可見
    
    print(ax.spines['bottom']) # axes.spines['key']返回的是 Spine 實(shí)例
    
    plt.savefig('spines22.png',facecolor='w')
    
    plt.show()

    Spine

    Python?matplotlib的spines模塊怎么使用

    Spine 對象的方法

    對于一般用戶,最重要的就是 spine.set_方法:

    • set_position()

    • set_color()

    • set_bounds()

    • set_patch_arc()

    • set_patch_circle()

    • set_pathc_line()

    set_position(self, position)

    設(shè)置 spine 對象的位置。

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

    position types 有:

    • &lsquo;outward&rsquo;: 將 spine 從數(shù)據(jù)區(qū)移出指定的點(diǎn)數(shù)。(負(fù)值是指 spine inwards。)

    • &lsquo;axes&rsquo;: 將 spine 放到定義的 Axes 坐標(biāo)系中,(0, 1)

    • &lsquo;data&rsquo;: 將 spine 放到定義的 data 坐標(biāo)系中。

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

    • &lsquo;center&rsquo; -> (&lsquo;axes&rsquo;, 0.5)

    • &lsquo;zero&rsquo; -> (&lsquo;data&rsquo;, 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()

    Python?matplotlib的spines模塊怎么使用

    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()

    Python?matplotlib的spines模塊怎么使用

    用法示例

    創(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()

    Python?matplotlib的spines模塊怎么使用

    偏移 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()

    Python?matplotlib的spines模塊怎么使用

    多 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()

    Python?matplotlib的spines模塊怎么使用

    到此,相信大家對“Python matplotlib的spines模塊怎么使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI