python 用Matplotlib作图中有多个Y轴


Posted in Python onNovember 28, 2020

在作图过程中,需要绘制多个变量,但是每个变量的数量级不同,在一个坐标轴下作图导致曲线变化很难观察,这时就用到多个坐标轴。本文除了涉及多个坐标轴还包括Axisartist相关作图指令、做图中label为公式的表达方式、matplotlib中常用指令。

一、放一个官方例子先

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

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 for axis
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 = ax_load.get_grid_helper().new_fixed_axis
cp_axisline = ax_cp.get_grid_helper().new_fixed_axis
wear_axisline = ax_wear.get_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(ax_cof.get_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()

该例子的作图结果为:

python 用Matplotlib作图中有多个Y轴

二、实际绘制

在实际使用中希望绘制的多变量数值如下表所示:

python 用Matplotlib作图中有多个Y轴

为了实现这个作图,经过反复修改美化,代码如下:

1.导入包

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

2.导入数据

x = ['ATL','LAX','CLT','LAS','MSP','DTW','PHX','DCA','SLC','ORD','DFW','PHL','PDX','DEN','IAH','BOS','SAN','BWI','MDW','IND']
k_in = [49.160,47.367,26.858,30.315,16.552,28.590,23.905,18.818,28.735,6.721,10.315,26.398,38.575,7.646,11.227,8.864,15.327,19.120,11.521,19.618]
k_out = [38.024,19.974,25.011,22.050,30.108,18.327,20.811,28.464,23.72,8.470,4.119,10.000,25.158,7.851,10.450,11.130,15.441,7.519,20.819,32.825]
p = [0.0537,0.0301,0.0306,0.0217,0.0229,0.0223,0.0218,0.0179,0.0155,0.0465,0.0419,0.0165,0.0091,0.0357,0.0232,0.0200,0.0129,0.0143,0.0113,0.0064]
K = [4.6844,2.0296,1.5858,1.1347,1.0706,1.0442,0.9764,0.8447,0.8141,0.7066,0.6041,0.5990,0.5808,0.5534,0.5023,0.3992,0.3964,0.3799,0.3639,0.3331]

3.作图并保存,相关指令后有备注,可以帮助理解

fig = plt.figure(1) #定义figure

ax_k = 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_p = ParasiteAxes(ax_k, sharex=ax_k)
ax_K = ParasiteAxes(ax_k, sharex=ax_k)

#append axes
ax_k.parasites.append(ax_p)
ax_k.parasites.append(ax_K)

ax_k.set_ylabel('$K_i^{in}\;/\;K_i^{out}$')
ax_k.axis['bottom'].major_ticklabels.set_rotation(45)
ax_k.set_xlabel('Airport')
ax_k.axis['bottom','left'].label.set_fontsize(12) # 设置轴label的大小
ax_k.axis['bottom'].major_ticklabels.set_pad(8) #设置x轴坐标刻度与x轴的距离,坐标轴刻度旋转会使label和坐标轴重合
ax_k.axis['bottom'].label.set_pad(12) #设置x轴坐标刻度与x轴label的距离,label会和坐标轴刻度重合
ax_k.axis[:].major_ticks.set_tick_out(True) #设置坐标轴上刻度突起的短线向外还是向内

#invisible right axis of ax_k
ax_k.axis['right'].set_visible(False)
ax_k.axis['top'].set_visible(True)
ax_p.axis['right'].set_visible(True)
ax_p.axis['right'].major_ticklabels.set_visible(True)
ax_p.axis['right'].label.set_visible(True)
ax_p.axis['right'].major_ticks.set_tick_out(True)
ax_p.set_ylabel('${p_i}$')
ax_p.axis['right'].label.set_fontsize(13)
ax_K.set_ylabel('${K_i}$')

K_axisline = ax_K.get_grid_helper().new_fixed_axis

ax_K.axis['right2'] = K_axisline(loc='right', axes=ax_K, offset=(60,0))
ax_K.axis['right2'].major_ticks.set_tick_out(True)
ax_K.axis['right2'].label.set_fontsize(13)
fig.add_axes(ax_k)

curve_k1, = ax_k.plot(list(range(20)), k_in, marker ='v',markersize=8,label="$K_i^{in}$",alpha = 0.7)
curve_k2, = ax_k.plot(list(range(20)), k_out, marker ='^',markersize=8, label="$K_i^{out}$",alpha = 0.7)
curve_p, = ax_p.plot(list(range(20)), p, marker ='P',markersize=8,label="${p_i}$",alpha = 0.7)
curve_K, = ax_K.plot(list(range(20)), K, marker ='o',markersize=8, label="${K_i}$",alpha = 0.7,linewidth=3)
plt.xticks(list(range(20)), x)
# ax_k.set_xticks(list(range(20))) 
# ax_k.set_xticklabels(x)
ax_k.axis['bottom'].major_ticklabels.set_rotation(45)

# ax_k.set_rotation(90)
# plt.xticks(list(range(20)), x, rotation = 'vertical')

ax_p.set_ylim(0,0.06)
ax_K.set_ylim(0,5)

ax_k.legend(labelspacing = 0.4, fontsize = 10)

#轴名称,刻度值的颜色 

ax_p.axis['right'].label.set_color(curve_p.get_color()) # 坐标轴label的颜色
ax_K.axis['right2'].label.set_color(curve_K.get_color())


ax_p.axis['right'].major_ticks.set_color(curve_p.get_color()) # 坐标轴刻度小突起的颜色
ax_K.axis['right2'].major_ticks.set_color(curve_K.get_color())

ax_p.axis['right'].major_ticklabels.set_color(curve_p.get_color()) # 坐标轴刻度值的颜色
ax_K.axis['right2'].major_ticklabels.set_color(curve_K.get_color())

ax_p.axis['right'].line.set_color(curve_p.get_color()) # 坐标轴线的颜色
ax_K.axis['right2'].line.set_color(curve_K.get_color())
plt.savefig('10.key metrics mapping.pdf', bbox_inches='tight', dpi=800)
plt.show()

4.绘制结果

python 用Matplotlib作图中有多个Y轴

PS

该作图是在Axisartist的基础上完成的,一些平时常用的绘制指令在此处是无用的。经过查找相关资料,https://www.osgeo.cn/matplotlib/tutorials/toolkits/axisartist.html 该网站可以提供一些用法的帮助。

以上就是python 用Matplotlib作图中有多个Y轴的详细内容,更多关于python Matplotlib作图的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
在Python的Django框架中编写错误提示页面
Jul 22 Python
python生成密码字典的方法
Jul 06 Python
Python 字符串与数字输出方法
Jul 16 Python
Python高级特性与几种函数的讲解
Mar 08 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
在Python中COM口的调用方法
Jul 03 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
Pandas —— resample()重采样和asfreq()频度转换方式
Feb 26 Python
基于Tensorflow一维卷积用法详解
May 22 Python
python 利用百度API识别图片文字(多线程版)
Dec 14 Python
python regex库实例用法总结
Jan 03 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 #Python
Python Http请求json解析库用法解析
Nov 28 #Python
基于Django集成CAS实现流程详解
Nov 28 #Python
Django haystack实现全文搜索代码示例
Nov 28 #Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 #Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 #Python
Python self用法详解
Nov 28 #Python
You might like
解读PHP中的垃圾回收机制
2015/08/10 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
srcElement表格样式
2006/09/03 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
用Python的urllib库提交WEB表单
2009/02/24 Python
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
python简单区块链模拟详解
2019/07/03 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
Python enumerate() 函数如何实现索引功能
2020/06/29 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
国际商务系学生个人的自我评价
2013/11/26 职场文书
《在山的那边》教学反思
2014/02/23 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
主管会计岗位职责
2014/03/13 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2014年建筑工作总结
2014/11/26 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
导游词之张家口
2019/12/13 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python