Python matplotlib的spines模块实例详解

目录
  • spines 模块详解
  • Spine 类
    • Spine 类的定义
    • Spine 类参数
    • 创建 Spine 对象的实例
      • 创建直线型 Spine 并添加到 axes
      • spine_type=‘circle’
  • 默认的 Spine 对象的存储和调用
  • Spine 对象的方法
    • set_position(self, position)
    • set_bounds()
  • 用法示例
    • 创建多个 yaxis
    • 偏移 axis
    • 多 vertices 的 path
  • 总结

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()方法获取figureaxes对象,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 对象。

总结

到此这篇关于Python matplotlib的spines模块的文章就介绍到这了,更多相关matplotlib spines模块详解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中的Matplotlib模块入门教程

    1 关于 Matplotlib 模块 Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric 及 Numarray,克隆了许多 Matlab 中的函数, 用以帮助用户轻松地获得高质量的二维图形.Matplotlib 可以绘制多种形式的图形包括普通的线图,直方图,饼图,散点图以及误差线图等:可以比较方便的定制图形的各种属性比如图线的类型,颜色,粗细,字体的大小等:它能够很好地支持一部分 Te

  • Windows下为Python安装Matplotlib模块

    这玩意反反复复弄了一晚上,这里详细叙述下如何安装,肯定会对大家有所帮助.首先默认大家都装了Python,这个从官网下基本不会有任何难度. (1)Setuptools的安装 为啥先说这个,后面所有whl文件都要用这个安装.基本上没有几个教程先介绍这个的,这里说全一点,方便小白使用. 我们装的是Setuptools 0.6c11.别的版本不是不行,因为这个在Pypi上面直接有exe文件,反正就是方便.地址:https://pypi.python.org/pypi/setuptools/0.6c11.

  • Python matplotlib的spines模块实例详解

    目录 spines 模块详解 Spine 类 Spine 类的定义 Spine 类参数 创建 Spine 对象的实例 创建直线型 Spine 并添加到 axes spine_type=‘circle’ 默认的 Spine 对象的存储和调用 Spine 对象的方法 set_position(self, position) set_bounds() 用法示例 创建多个 yaxis 偏移 axis 多 vertices 的 path 总结 spines 模块详解 matplotlib 设计了一个 sp

  • Python Matplotlib数据可视化模块使用详解

    目录 前言 1 matplotlib 开发环境搭建 2 绘制基础 2.1 绘制直线 2.2 绘制折线 2.3 设置标签文字和线条粗细 2.4 绘制一元二次方程的曲线 y=x^2 2.5 绘制正弦曲线和余弦曲线 3 绘制散点图 4 绘制柱状图 5 绘制饼状图 6 绘制直方图 7 绘制等高线图 8 绘制三维图 总结 本文主要介绍python 数据可视化模块 Matplotlib,并试图对其进行一个详尽的介绍. 通过阅读本文,你可以: 了解什么是 Matplotlib 掌握如何用 Matplotlib

  • Python日期时间Time模块实例详解

    本文实例讲述了Python日期时间Time模块.分享给大家供大家参考,具体如下: 关于时间和日期模块 python程序能用很多方式处理日期和时间,转换日期格式是一种常见的功能. python提供了一个time和calendar模块可以用于格式化日期和时间. 时间间隔是以秒为单位的浮点小数 每个时间戳都以自从1970年1月1日午夜(历元)经过了多长时间来表示. python的time模块下有很多函数可以转换常见的日期格式. Time模块 1.1 名词解释 UTC :格林威治天文时间,世界标准时间,

  • matplotlib在python上绘制3D散点图实例详解

    大家可以先参考官方演示文档: 效果图: ''' ============== 3D scatterplot ============== Demonstration of a basic scatterplot in 3D. ''' from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np def randrange(n, vmin, vmax): ''' Helper f

  • python实现马丁策略的实例详解

    马丁策略本来是一种赌博方法,但在投资界应用也很广泛,不过对于投资者来说马丁策略过于简单,所以本文将其改进并使得其在震荡市中获利,以下说明如何实现马丁策略. 策略 逢跌加仓,间隔由自己决定,每次加仓是当前仓位的一倍. 连续跌两次卖出,且卖出一半仓位. 如果爆仓则全仓卖出止损. 初始持仓设置为10%~25%,则可进行2到3次补仓. 初始化马丁策略类属性 def __init__(self,startcash, start, end): self.cash = startcash #初始化现金 sel

  • Python命令启动Web服务器实例详解

    Python命令启动Web服务器实例详解 利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m SimpleHTTPServer 8080 然后就可以在浏览器中输入 http://localhost:端口号/路径 来访问服务器资源. 例如: http://localhost:8080/index.htm(当然index.htm文件得自己创建) 其他机器

  • Python探索之URL Dispatcher实例详解

    URL dispatcher简单点理解就是根据URL,将请求分发到相应的方法中去处理,它是对URL和View的一个映射,它的实现其实也很简单,就是一个正则匹配的过程,事先定义好正则表达式和该正则表达式对应的view方法,如果请求的URL符合这个正则表达式,那么就分发这个请求到这个view方法中. 有了这个base,我们先抛出几个问题,提前思考一下: 这个映射定义在哪里?当映射很多时,如果有效的组织? URL中的参数怎么获取,怎么传给view方法? 如何在view或者是template中反解出UR

  • Python 网页解析HTMLParse的实例详解

    Python 网页解析HTMLParse的实例详解 使用python将网页抓取下来之后,下一步我们就应该解析网页,提取我们所需要的内容了,在python里提供了一个简单的解析模块HTMLParser类,使用起来也是比较简单的,解析语法没有用到XPath类似的简洁模式,但新手用起来还是比较容易的,看下面的例子: 现在一个模拟的html文件: <html> <title id='main' mouse='你好'>我是标题</title><body>我是内容<

  • python中的decimal类型转换实例详解

    [Python标准库]decimal--定点数和浮点数的数学运算 作用:使用定点数和浮点数的小数运算.         Python 版本:2.4 及以后版本 decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算.Decimal 实例可以准确地表示任何数,对其上取整或下取整,还可以对有效数字个数加以限制. Decimal 小数值表示为 Decimal 类的实例.构造函数取一个整数或字符串作为参数.使用

  • Python文件操作函数用法实例详解

    这篇文章主要介绍了Python文件操作函数用法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字符编码 二进制和字符之间的转换过程 --> 字符编码 ascii,gbk,shit,fuck 每个国家都有自己的编码方式 美国电脑内存中的编码方式为ascii ; 中国电脑内存中的编码方式为gbk , 美国电脑无法识别中国电脑写的程序 , 中国电脑无法识别美国电脑写的程序 现在硬盘中躺着 ascii/gbk/shit/fuck 编码的文件,

随机推荐