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'])

- 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模块详解内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!