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 Spinefig = 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 Spinefig = 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 npfig = 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 Spinefig = 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) 位置

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.path import Path
from matplotlib.spines import Spinefig = 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 pltnp.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 randomfig, 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 Spinefig = 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 Spinefig = 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 对象。

欢迎到QQ群:457079928,来 “Python草堂” 讨论交流。

matplotlib 的 spines模块详解相关推荐

  1. python哪个关键字可以导入模块_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

  2. python中导入模块是用哪个关键字_关于python导入模块import与常见的模块详解

    0.什么是python模块?干什么的用的? Java中如果使用abs()函数,则需要需要导入Math包,同样python也是封装的,因为python提供的函数太多,所以根据函数的功能将其封装在不同的m ...

  3. Matplotlib subplot()函数用法详解

    Matplotlib subplot()函数用法详解 在使用 Matplotlib 绘图时,我们大多数情况下,需要将一张画布划分为若干个子区域,之后,我们就可以在这些区域上绘制不用的图形.在本节,我们 ...

  4. 【ES6】Module模块详解

    [ES6]Module模块详解 一.Module的由来 二.严格模式 三.export命令 四.import命令 查看更多ES6教学文章: 参考文献 引言:由于两个JS文件之间相互使用必须通过一个ht ...

  5. matplotlib.pyplot.plot 用法详解

    python matplotlib演示官网 https://matplotlib.org/xkcd/users/pyplot_tutorial.html https://matplotlib.org/ ...

  6. python常用内置模块-Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  7. python之sys模块详解_(转)python之os,sys模块详解

    python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...

  8. Ansible基本使用及常用模块详解

    一.ansible基本使用 定义主机组 定义被管理节点列表的文件/etc/ansible/hosts,在定义被管理节点的时候,可以单独基于主机做定义,也可以将多个主机定义成一个主机组. 在上篇博文安装 ...

  9. Nginx源码研究之nginx限流模块详解

    这篇文章主要介绍了Nginx源码研究之nginx限流模块详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 高并发系统有三把利器:缓存.降级和限流: 限流的目的是通过对并 ...

最新文章

  1. Python模块学习
  2. react 图片放在src里面还是public_手写Webpack从0编译Vue/React项目
  3. 一些会遗忘的代码属性
  4. Springmvc 的post请求的json格式参数
  5. C语言运算符优先级(超级详细)
  6. basler恢复出厂设置_bios恢复出厂设置
  7. 有限体积法求解二维方腔流(三)——代码以及与icoFoam结果对比
  8. 【入门必备】如何学习一门编程语言——这些你一定要知道
  9. poi 导出 word 表格样式
  10. 宽窄巷子,最成都?1038
  11. openstack平台上创建云主机
  12. 程序员提升逼格技巧汇总
  13. DuiLib : 做一个没有任务栏图标的Dialog
  14. android校准电池,为什么电池校准不适用于Android智能手机
  15. 微信小程序的五种跳转方式
  16. 没学过量子力学,物理学也是一团糟,不过我觉得这个故事很有意思
  17. 添加验证网站之CNAME验证操作-百度搜索资源平台
  18. 炒股亏损是什么原因?
  19. Java迷你图书管理器1.2-面向对象+I/O流
  20. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

热门文章

  1. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
  2. 5. Linux C 输入输出与文件
  3. 随心所欲b超工作站图像处理_正版B超随心所欲超声工作站vista版最新版模拟数字影像软件win7...
  4. guid主分区表损坏如何处理_什么是GPT或GUID分区表
  5. jQueryDay04:distpicker省市县三级联动, Layer插件,Laydate插件
  6. 视频号带货优势有哪些?普通人为什么要做视频号:国仁楠哥
  7. 如何防止U盘病毒入侵方法
  8. 65nm粒径量子点MMSNs-HRP-CDs/CP-CDs结合酶/蛋白/荧光的制备过程
  9. python批量图像处理_基于python代码批量处理图片resize
  10. iView级联选择器Cascader回显慢的问题