python多轴图_python中⽤Matplotlib做多个纵轴(多y轴)Matlab⾥做多给轴的函数很直接,双轴是plotyy, 三轴是plotyyy, 四轴是plot4y,更多应该是multiplotyyy。
⽽matplotlib似乎可以⽤figure.add_axes()来实现,探索中……
多轴绘制的图层原理
“Matplotlib⼩讲堂”(号:Matplotlibclass)⼀篇⽂章介绍了Matplotlib的图层,结合⾃⼰的理解,摘要总结如下
图层可分为四种
Canvas层 画布层 位于最底层,⽤户⼀般接触不到。 matplotlib.pyplot就是⼀个canvas层
Figure层 图像层 建⽴在Canvas之上。 plt.figure()就是⼀个figure层
Axes层 坐标层 建⽴在Figure之上。fig.add_axes(ax)就加⼀个Axes层ax在figure上,这时就可以画出⼀个空⽩的坐标了。
plot层 绘制层 坐标轴、图例等辅助信息层以及图像层都是建⽴在Axes之上
【2018-5-14】
多轴的绘制要⽤到有两种⽅法可以实现,⼀是⽤主轴和寄⽣轴的⽅法,即mpl_toolkits.axisartist.parasite_axes⾥的HostAxes,和ParasiteAxes。 另⼀种是⽤twinx(),结合mpl_toolkits.axes_grid1⾥的host_subplot。 这⾥⽤寄⽣轴的⽅法实现。
⾸先是要创建主轴⽤HostAxes(figure,[ 左,下,宽,⾼ ]) 然后寄⽣出独⽴的y轴来,并共享x轴。独⽴的y轴对应独⽴的曲线 将寄⽣轴加⼊主轴的列表
第⼀根寄⽣轴可以直接借⽤原坐标的右轴,所以不需要新增轴 如果需要两个以上的y轴,第三个y轴就要新建固定轴了,要⽤到
get_grid_helper().new_fixed_axis 设置第三及更多Y轴的偏移量 将主轴装载到figure上 设置轴的外⾯特性,⽐如颜⾊,刻度范围等
frommpl_toolkits.axisartist.parasite_axes import HostAxes, ParasiteAxes
import matplotlib.pyplotasplt
import numpyasnp
fig= plt.figure(1) #定义figure,(1)中的1是什么
ax_cof= HostAxes(fig, [0, 0, 0.9, 0.9]) #⽤[left, bottom, weight, height]的⽅式定义axes,0 <= l,b,w,h <= 1#parasite addtional axes, share x
ax_temp= ParasiteAxes(ax_cof, sharex=ax_cof)
ax_load= ParasiteAxes(ax_cof, sharex=ax_cof)
ax_cp= ParasiteAxes(ax_cof, sharex=ax_cof)
ax_wear= ParasiteAxes(ax_cof, sharex=ax_cof)
#append axes
ax_cof.parasites.append(ax_temp)
ax_cof.parasites.append(ax_load)
ax_cof.parasites.append(ax_cp)
ax_cof.parasites.append(ax_wear)
#invisible right axis of ax_cof
ax_cof.axis['right'].set_visible(False)
ax_cof.axis['top'].set_visible(False)
ax_temp.axis['right'].set_visible(True)
ax_temp.axis['right'].major_ticklabels.set_visible(True)
ax_temp.axis['right'].label.set_visible(True)
#set label foraxis
ax_cof.set_ylabel('cof')
ax_cof.set_xlabel('Distance (m)')
ax_temp.set_ylabel('Temperature')
ax_load.set_ylabel('load')
ax_cp.set_ylabel('CP')
ax_wear.set_ylabel('Wear')
load_axisline=_grid_helper().new_fixed_axis
cp_axisline=_grid_helper().new_fixed_axis
wear_axisline=_grid_helper().new_fixed_axis
ax_load.axis['right2'] = load_axisline(loc='right', axes=ax_load, offset=(40,0))
ax_cp.axis['right3'] = cp_axisline(loc='right', axes=ax_cp, offset=(80,0))
ax_wear.axis['right4'] = wear_axisline(loc='right', axes=ax_wear, offset=(120,0))
fig.add_axes(ax_cof)'''#set limit of x, y
ax_cof.set_xlim(0,2)
ax_cof.set_ylim(0,3)'''curve_cof,= ax_cof.plot([0, 1, 2], [0, 1, 2], label="CoF", color='black') curve_temp,= ax_temp.plot([0, 1, 2], [0, 3, 2], label="Temp", color='red')
curve_load,= ax_load.plot([0, 1, 2], [1, 2, 3], label="Load", color='green')
curve_cp,= ax_cp.plot([0, 1, 2], [0, 40, 25], label="CP", color='pink')
curve_wear,= ax_wear.plot([0, 1, 2], [25, 18, 9], label="Wear", color='blue')
ax_temp.set_ylim(0,4)
ax_load.set_ylim(0,4)
ax_cp.set_ylim(0,50)
ax_wear.set_ylim(0,30)
ax_cof.legend()
#轴名称,刻度值的颜⾊
#ax_cof.axis['left'].label.set_color(_color())
ax_temp.axis['right'].label.set_color('red')
ax_load.axis['right2'].label.set_color('green')
ax_cp.axis['right3'].label.set_color('pink')
ax_wear.axis['right4'].label.set_color('blue')
ax_temp.axis['right'].major_ticks.set_color('red')
ax_load.axis['right2'].major_ticks.set_color('green')
ax_cp.axis['right3'].major_ticks.set_color('pink')
ax_wear.axis['right4'].major_ticks.set_color('blue')
ax_temp.axis['right'].major_ticklabels.set_color('red')
ax_load.axis['right2'].major_ticklabels.set_color('green')
ax_cp.axis['right3'].major_ticklabels.set_color('pink')
ax_wear.axis['right4'].major_ticklabels.set_color('blue')
ax_temp.axis['right'].line.set_color('red')
ax_load.axis['right2'].line.set_color('green')
ax_cp.axis['right3'].line.set_color('pink')
ax_wear.axis['right4'].line.set_color('blue')
plt.show()
结果是这样的:
以下是摸索过程中的练习,给⾃⼰纪录⼀下。
⽤⼀个修改了的官⽅例⼦来说明⼀下, jupyter notebook 代码如下:
%matplotlib inline
from mpl_toolkits.axisartist.parasite_axes import HostAxes, ParasiteAxes import matplotlib.pyplot as plt
fig = plt.figure(1)
host = HostAxes(fig, [0.15, 0.1, 0.65, 0.8])
par1 = ParasiteAxes(host, sharex=host)
par2 = ParasiteAxes(host, sharex=host)
host.parasites.append(par1)
host.parasites.append(par2)
host.set_ylabel('Denstity')
host.set_xlabel('Distance')
host.axis['right'].set_visible(False)
par1.axis['right'].set_visible(True)
par1.set_ylabel('Temperature')
par1.axis['right'].major_ticklabels.set_visible(True)
par1.axis['right'].label.set_visible(True)
par2.set_ylabel('Velocity')
offset = (60, 0)
new_axisline = par2._w_fixed_axis  # "_grid_helper"与"get_grid_helper()"等价,可以代替
#new_axisline = _grid_helper().new_fixed_axis  # ⽤"get_grid_helper()"代替,结果⼀样,区别⽬前不清楚par2.axis['right2'] = new_axisline(loc='right', axes=par2, offset=offset)
fig.add_axes(host)
host.set_xlim(0,2)
host.set_ylim(0,2)
host.set_xlabel('Distance')
host.set_ylabel('Density')
host.set_ylabel('Temperature')
p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature")
p3, = par2.plot([0, 1, 2], [50, 30, 15], label="Velocity")
par1.set_ylim(0,4)
par2.set_ylim(1,60)
host.legend()
#轴名称,刻度值的颜⾊
host.axis['left'].label.set__color())
par1.axis['right'].label.set__color())
par2.axis['right2'].label.set__color())
par2.axis['right2'].major_ticklabels.set__color()) #刻度值颜⾊
par2.axis['right2'].set_axisline_style('-|>',size=1.5) #轴的形状⾊
matplotlib中subplotpar2.axis['right2'].line.set__color()) #轴的颜⾊
结果图是这样:
尝试引⼊浮动坐标轴来实现多轴,但貌似浮动的纵轴如果在坐标边界右边就不能显⽰出来了,
update: 浮动轴应该是只能在原坐标内显⽰,要增加纵轴,像matplab中plotyyy函数那样的纵轴要⽤固定轴,与浮动轴对应函数是ax.new_fixed_axis(location, offset)
代码如下:
importmpl_toolkits.axisartist as AAimportmatplotlib.pyplot as plt%matplotlib inline
fig= plt.figure(1) #定义figure,(1)中的1是什么
ax = AA.Axes(fig, [0, 0, 0.9, 0.9]) #⽤[left, bottom, weight, height]的⽅式定义axes,0 <= l,b,w,h <= 1
fig.add_axes(ax)#⽤Subplot的⽅式定义
ax1 = AA.Subplot(fig,211)
fig.add_axes(ax1)#控制,t,b,r,l轴的显⽰与否
ax.axis["right"].set_visible(False)
ax.axis["top"].set_visible(False)
ax1.axis['bottom'].set_visible(False)
ax1.axis['left'].set_visible(False)#浮动轴,nth_coord=0是横轴,=1是纵轴,value是交叉点
ax.axis['x=0.5'] = ax.new_floating_axis(nth_coord=1, value=0.5)
ax.axis['x=0.5'].set_axisline_style('->', size=1.5) #坐标带箭头
#增加y轴,⽤new_fixed_axis(location, offset(右多少,上多少))
ax.axis['right2'] = ax.new_fixed_axis(loc='right',
offset=(50,0))
结果如下
试验过程中发现⼀隐藏功能

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。