Python matplotlib的spines模块实例详解
作者:Python草堂 发布时间:2021-10-11 06:37:58
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 对象。
来源:https://blog.csdn.net/sinat_32570141/article/details/113848009


猜你喜欢
- 背景最近用uni-app开发小程序项目时,部分需要持久化的内容没法像其他vuex中的state那样调用,所以想着自己实现一下类似vuex-p
- 最近项目中使用了vue-router的addRoutes这个api,遇到了一个小坑,记录总结一下。场景复现:做前端开发的同学,大多都遇到过这
- 本文实例讲述了python实现Oracle查询分组的方法。分享给大家供大家参考,具体如下:1.分组的概念:关键字:group by子句结论:
- MySQL常用的四种引擎的介绍(1):MyISAM存储引擎:不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以sele
- 在有些情况下,利用try…except来捕捉异常可以起到代替if…else的作用。比如在判断一个链表是否存在环的leetcode题目中,初始
- 空接口定义空接口是特殊形式的接口类型,普通的接口都有方法,而空接口没有定义任何方法口,也因此,我们可以说所有类型都至少实现了空接口。type
- 本文性别判断主要依靠airtest中的自动化测试实现通过自动对比支付宝页面男女图像,从而实现男女判断代码如下:男女判断函数:// An hi
- 今天看到同事参与小米的抢购,几经数个星期的尝试,终于抢到了一台小米电视……看了一下小米的抢购流程,似乎可以用程序可破。于是想写点东西玩玩(你
- 奥运来了,三大门户网站都加上了奥运主题。加上下面代码你的网站也拥有奥运主题了:<style type="text/
- 很多SQL Server程序员对子查询(subqueries)的使用感到困惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们
- 经常使用word办公的小伙伴们经常会遇到邮件合并的任务,通常会将数量有限的表格中的信息通过word的邮件合并功能,自动生成word文档,操作
- 一、使用python内置commands模块执行shellcommands对Python的os.popen()进行了封装,使用SHELL命令
- 本文实例为大家分享了js实现九宫格抽奖的具体代码,供大家参考,具体内容如下<div id="contaner"&g
- 独立 fmt Log输出重定向golang的fmt包的输出函数 Println、Printf、PrintStack等,默认将打印输出到os.
- 本文为大家分享了python爱心表白的具体代码,供大家参考,具体内容如下import turtleimport time# 画爱心的顶部de
- 最近需要训练一个生成对抗网络模型,然后开发接口,不得不在一台有显卡的远程linux服务器上进行,所以,趁着这个机会研究了下怎么使用vscod
- 本文实例讲述了Python决策树和随机森林算法。分享给大家供大家参考,具体如下:决策树和随机森林都是常用的分类算法,它们的判断逻辑和人的思维
- 本文实例讲述了php实现的CSS更新类及其用法,非常实用。分享给大家供大家参考。具体如下:CSSUpdate.class.php类文件如下:
- 为了构造透明的叠加层,需要准备两个图像:(1)原始图片;(2)要 “叠加”在第一个图像上的图像(包含某种级别的Alpha透明度)。透明叠加层
- 简介Flv.js 是 HTML5 Flash 视频(FLV)播放器,纯原生 JavaScript 开发,没有用到 Flash。由 bilib