Matplotlib 隐藏刻度方式显示三个Y轴

Matplotlib 三个Y轴显示学习过使用文本画一个Y轴的方式来实现第三条Y轴,或者第四条,第五条的Y轴实现。这是采用了一定的文本技巧的方式,适合在教学的演示图,因为显示出来的第三条Y轴与前面两条Y轴有点差别,导致不太美观。如果追求完美的方式,应该采用内部自画的线条来实现第三条Y轴的实现。下面来介绍第二种方法实现三Y轴显示,这种方法是采用隐藏刻度的方式来实现的,先来看一下图:

Matplotlib隐藏刻度方式显示三个Y轴

可以看到这个图里有四个边线,叫做spine,也就是X轴、第一个Y轴、第二个Y轴和最上面的X轴。如果我们想要第三个Y轴,其实只需要第二个Y轴,即是红色刻度的Y轴即可,那么我们只要把其它三条隐藏起来,并且把中间区域去掉,那么只剩下右边的Y轴坐标了。因此在matplotlib里把这四个连线叫做spines,也可以叫做包围线。

当理解这个思路之后,就比较简单了,通过par2.spines[“right”]就可以访问右边的轴,通过ax.spines.values()就可以访问所有的轴,因而写出下面的函数来隐藏所有轴:

def make_patch_spines_invisible(ax):

    ax.set_frame_on(True)

    ax.patch.set_visible(False)

    for sp in ax.spines.values():

        sp.set_visible(False)

这个函数把四条轴全部隐藏了,那么就一条也看不见了,这样怎么行呢?其实它在后面再次地把右边的轴设置为可见的:

par2.spines["right"].set_visible(True)

这行代码就是实现这个功能。

整个程序的核心,就是采用创建两个共享Y轴,然后把第二共享Y轴的坐标进行三条隐藏,留下最右边那条,并且设置的位置为第一条Y轴的1.2倍的位置,这样就实现了第三条Y轴显示。其它代码的就是实现Y轴的名称、颜色、刻度的范围,以及最后实现图例显示。

整个例子的结果显示如下:

Matplotlib隐藏刻度方式显示三个Y轴

代码如下:

import numpy as np
import matplotlib.pyplot as plt


#定义显示的数据
x = [20, 40, 60, 80, 100, 120, 140]
T = [30, 50, 30, 46, 70, 43, 80]
P = [1.0, 2.0, 4.0, 6.0, 6.0, 5.5, 7.0]
V = [0.6, 0.58, 0.55, 0.45, 0.35, 0.25, 0.15]

def make_patch_spines_invisible(ax):
    ax.set_frame_on(True)
    ax.patch.set_visible(False)
    for sp in ax.spines.values():
        sp.set_visible(False)
#创建子图,并创建第一条Y轴
plt.figure('deepinout.com 极客笔记')
fig, host = plt.subplots()  #创建子图
host.grid(True)
fig.subplots_adjust(right=0.75)

#创建第二条Y轴
par1 = host.twinx()
#创建第三条Y轴,把第三条Y轴的其它三边隐藏起来,只留下右边显示
par2 = host.twinx()
par2.spines["right"].set_position(("axes", 1.2))
make_patch_spines_invisible(par2)
par2.spines["right"].set_visible(True)

#画三条曲线
p1, = host.plot(x, T, "b-", label="Temperature")
p2, = par1.plot(x, P, "r-", label="Pressure")
p3, = par2.plot(x, V, "g-", label="Volume")

#设置X和三条Y轴的刻度范围
host.set_xlim(0, 150)
host.set_ylim(0, 100)
par1.set_ylim(0, 10)
par2.set_ylim(0, 2)

#设置每条轴的名称
host.set_xlabel("Time")
host.set_ylabel("Temperature")
par1.set_ylabel("Pressure")
par2.set_ylabel("Volume")

#设置轴名称的颜色
host.yaxis.label.set_color(p1.get_color())
par1.yaxis.label.set_color(p2.get_color())
par2.yaxis.label.set_color(p3.get_color())

#设置轴刻度线的颜色
tkw = dict(size=4, width=1.5)
host.tick_params(axis='y', colors=p1.get_color(), **tkw)
par1.tick_params(axis='y', colors=p2.get_color(), **tkw)
par2.tick_params(axis='y', colors=p3.get_color(), **tkw)
host.tick_params(axis='x', **tkw)

#生成图例
lines = [p1, p2, p3]
host.legend(lines, [l.get_label() for l in lines])

plt.show()

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程