Matplotlib 四个Y轴显示

Matplotlib 三个Y轴显示学习了三个Y轴的方式实现,一般情况下的数据显示,可以解决了问题,也可以完成了实验报告了。如果你还有更多的因素相互一起,比如四个Y轴,那么又要怎么办呢?本文将要解决这种问题,无论你是四个Y轴,还是五个Y轴,都可以按照这种方式来解决,以便解决对于Y轴多少的担忧。

创建一个寄生轴,这些轴将与主体轴共享x比例,但在y方向显示不同的比例。往往在画图里,比如时间是一条公共的主轴,也就是共享的X轴,因为时间都是相同的比例,然后另外一条Y轴可以表示房价,一条Y轴可以表示面积,一条Y轴表示与地铁站的位置,一条Y轴表示与学校的位置等等。

这里采用寄生轴的方式实现多Y轴实现,与前面采用文本方式实现、以及采用隐藏方式实现有点不同,它是采用mpl_toolkits.axisartist.parasite_axes里的HostAxes,和ParasiteAxes。首先是要创建主轴用HostAxes(figure,[ 左,下,宽,高 ]) 然后寄生出独立的y轴来,并共享x轴。独立的y轴对应独立的曲线 将寄生轴加入主轴的列表。第一根寄生轴可以直接借用原坐标的右轴,所以不需要新增轴,如果需要两个以上的y轴,第三个y轴就要新建固定轴了,要用到get_grid_helper().new_fixed_axis 设置第三及更多Y轴的偏移量 将主轴装载到figure上 设置轴的外面特性,比如颜色,刻度范围等

本文里将编写代码实现如下图:

Matplotlib四个Y轴显示

可以看到,在右边添加了两条新的Y轴,就对应多了两条曲线数据。接着下来看一下代码的实现过程,首先引入寄生轴的库:

from mpl_toolkits.axisartist.parasite_axes import HostAxes, ParasiteAxes

这行代码主要导入两个函数HostAxes和ParasiteAxes,HostAxes函数负责创建主坐标系,ParasiteAxes负责创建辅助坐标系,通过参数sharex=host来设置共享X轴的坐标。ParasiteAxes函数调用了三遍,这样就创建了三个Y轴,与原来的主坐标系里Y轴,就构成了四个Y轴。

host.parasites.append(par1)

这行代码是把寄生轴添加主坐标轴里。



offset = (40, 0)

new_axisline = par2.get_grid_helper().new_fixed_axis

par2.axis["right2"] = new_axisline(loc="right", axes=par2, offset=offset)

这段代码就是实现添加一个新的寄生轴。offset是一个相对位置,right是表示在原来坐标轴的右边,X轴的方向偏移40个单位的地方显示。

offset = (100, 0)

new_axisline = par3.get_grid_helper().new_fixed_axis

par3.axis["right2"] = new_axisline(loc="right", axes=par3, offset=offset)

上面这段代码同样增加第四条Y轴,跟第三条Y轴是一样的。

fig.add_axes(host)

最后把四个Y轴的坐标系添加到画布上面,这样形成了整个绘图区域。其它的代码,都是跟前面的例子是一样,设置坐标轴的标签、颜色、刻度的颜色,以及图例显示。

整个例子的代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axisartist.parasite_axes import HostAxes, ParasiteAxes


#定义显示的数据
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]
H = [1.6, 1.58, 1.55, 1.45, 1.35, 1.25, 1.15]
#
fig = plt.figure('deepinout.com 极客笔记')

host = HostAxes(fig, [0.10, 0.1, 0.65, 0.8])
par1 = ParasiteAxes(host, sharex=host)
par2 = ParasiteAxes(host, sharex=host)
par3 = ParasiteAxes(host, sharex=host)

host.parasites.append(par1)
host.parasites.append(par2)
host.parasites.append(par3)
host.axis["right"].set_visible(False)

par1.axis["right"].set_visible(True)
par1.axis["right"].major_ticklabels.set_visible(True)
par1.axis["right"].label.set_visible(True)

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

# 于 offset 处新建一条纵坐标
offset = (40, 0)
new_axisline = par2.get_grid_helper().new_fixed_axis
par2.axis["right2"] = new_axisline(loc="right", axes=par2, offset=offset)

#新建第四条纵坐标轴
offset = (100, 0)
new_axisline = par3.get_grid_helper().new_fixed_axis
par3.axis["right2"] = new_axisline(loc="right", axes=par3, offset=offset)

fig.add_axes(host)

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

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

#设置轴名称的颜色
host.axis["left"].label.set_color(p1.get_color())
par1.axis["right"].label.set_color(p2.get_color())
par2.axis["right2"].label.set_color(p3.get_color())
par3.axis["right2"].label.set_color(p4.get_color())

#设置轴刻度线的颜色
host.axis["left"].major_ticks.set_color(p1.get_color())
par1.axis["right"].major_ticks.set_color(p2.get_color())
par2.axis["right2"].major_ticks.set_color(p3.get_color())
par3.axis["right2"].major_ticks.set_color(p4.get_color())

host.axis["left"].major_ticklabels.set_color(p1.get_color())
par1.axis["right"].major_ticklabels.set_color(p2.get_color())
par2.axis["right2"].major_ticklabels.set_color(p3.get_color())
par3.axis["right2"].major_ticklabels.set_color(p4.get_color())


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

plt.show()
赞(0)
未经允许不得转载:极客笔记 » Matplotlib 四个Y轴显示
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址