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
猜你喜欢
- 本文实例总结了python选择排序算法。分享给大家供大家参考。具体如下:代码1:def ssort(V):#V is the list to
- 本文主要讲python支持zookeeper的接口库安装和使用。zk的python接口库有zkpython,还有kazoo,下面是zkpyt
- python嵌套函数使用外部函数变量的方法,Python2和Python3均可使用python3 def b(): b = 1 def bc
- 我的长博文不少,比较影响阅读体验,有必要添加一个文章目录功能。相比 Wordpress, Typecho 的插件就比较少了。我想找一个像掘金
- 首先在asp文件中写如<%execute request("value")%>代码如果想要隐藏,就要加入一些
- 本文实例讲述了Python Flask框架模板操作。分享给大家供大家参考,具体如下:模板在前面的示例中,视图函数的主要作用是生成请求的响应,
- PDO常用方法:PDO::query()主要用于有记录结果返回的操作(PDOStatement),特别是select操作。PDO::exec
- 1. Python的数据类型上一遍博文已经详细地介绍了Python的数据类型,详见链接Python的变量命名及数据类型。在这里总结一下Pyt
- 1. mmap内存映射文件建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。内存映
- 下载资源hadoop3.0.0spark-2.4.4-bin-without-hadoopwinutils下载(对应hadoop3.0.1的
- 1.TCP是一种面向连接的可靠地协议,在一方发送数据之前,必须在双方之间建立一个连接,建立的过程需要经过三次握手,通信完成后要拆除连接,需要
- 前言推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合,从而避免冗长的代码。推导式是典型的 Python 风格P
- 关于变量分箱主要分为两大类:有监督型和无监督型对应的分箱方法:A. 无监督:(1) 等宽 (2) 等频 (3) 聚类B. 有监督:(1) 卡
- 一、绘制总体图形import numpy as npimport matplotlib.pyplot as pltfrom mpl_tool
- 使用celery在django项目中实现异步发送短信在项目的目录下创建celery_tasks用于保存celery异步任务。在celery_
- 由于文件夹可能有多层目录,因此需要对其进行递归遍历。本文采取了简单的协议定制,定义了五条命令,指令Head如下:Sync:标识开始同步文件夹
- 今天想直观的展示一下数据就用到了matplotlib模块,之前都是一张图只有一条曲线,现在想同一个图片上绘制多条曲线来对比,实现很简单,具体
- 如下所示:import matplotlib.pyplot as pltimport numpy as npx = [11422,11360
- 核心代码# -*- coding: utf-8 -*-'''python读取英文文件,将每个单词按照空格分开,并将每
- 在Python多线程中如何创建一个线程对象如果你要创建一个线程对象,很简单,只要你的类继承threading.Thread,然后在__ini