脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python matplotlib的spines模块实例详解

Python matplotlib的spines模块实例详解

2022-08-03 11:12Python草堂 Python

作为程序员,经常需要进行绘图,下面这篇文章主要给大家介绍了关于Python matplotlib的spines模块的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

 

spines 模块详解

matplotlib 设计了一个 spines模块,用于在创建 axes 时生成 Spine对象(坐标轴线)。

spines模块定义了一个 Spine 类,为类定义了 25 个方法,其中有 3 个是 classmethod。

Python matplotlib的spines模块实例详解

 

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()

Python matplotlib的spines模块实例详解

 

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()

Python matplotlib的spines模块实例详解

 

默认的 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"])

Python matplotlib的spines模块实例详解

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

Python matplotlib的spines模块实例详解

 

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()

Python matplotlib的spines模块实例详解

 

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()

Python matplotlib的spines模块实例详解

 

用法示例

 

创建多个 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()

Python matplotlib的spines模块实例详解

 

偏移 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()

Python matplotlib的spines模块实例详解

 

多 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()

Python matplotlib的spines模块实例详解

axis 是连接 ticks 的线,我们已经可以控制 axis 的 spine,下一篇开始将讨论 ticks 对象。

 

总结

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

原文地址:https://blog.csdn.net/sinat_32570141/article/details/113848009

延伸 · 阅读

精彩推荐
  • PythonDjango框架中间件(Middleware)用法实例分析

    Django框架中间件(Middleware)用法实例分析

    这篇文章主要介绍了Django框架中间件(Middleware)用法,结合实例形式分析了Django框架中间件(Middleware)的功能、用法及相关操作技巧,需要的朋友可以参考下...

    12573090545302021-06-29
  • Python分析详解python多线程与多进程区别

    分析详解python多线程与多进程区别

    这篇文章主要为大家分析详解了python多线程与多进程区别,以及在使用过程中的注意要点,有需要的朋友可以借鉴参考下,希望可以有所帮助...

    xz13085793404822022-01-01
  • PythonPython中生成Epoch的方法

    Python中生成Epoch的方法

    下面小编就为大家带来一篇Python中生成Epoch的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Python教程网12192020-09-30
  • PythonPython打包方法Pyinstaller的使用

    Python打包方法Pyinstaller的使用

    在我们完成一个Python项目或一个程序时,希望将Python的py文件打包成在Windows系统下直接可以运行的exe程序。这篇文章主要介绍了Python打包方法Pyinstaller的使...

    晴空行12782021-04-06
  • PythonPython学习小技巧总结

    Python学习小技巧总结

    本篇文章给大家总结了关于python相关知识点学习的技巧以及难点,有兴趣的朋友可以参考学习下。...

    sinat_3402229811322021-03-03
  • Python对python中字典keys,values,items的使用详解

    对python中字典keys,values,items的使用详解

    今天小编就为大家分享一篇对python中字典keys,values,items的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    HYESC5172021-05-26
  • Python如何在Python中创建和使用虚拟环境

    如何在Python中创建和使用虚拟环境

    Python中的虚拟环境是一个很有用的功能,可以建立多个互不干扰的空间,每个空间中安装的包都是相互独立的。...

    HexUp5782021-10-28
  • Pythonpython高级内置函数用法实例

    python高级内置函数用法实例

    在本篇文章里小编给大家整理的是一篇关于python高级内置函数用法实例内容,有兴趣的朋友们可以学参考下。...

    小妮浅浅4892022-01-11