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 相关文章推荐
python模拟enum枚举类型的方法小结
Apr 30 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
Python编程之string相关操作实例详解
Jul 22 Python
python中装饰器级连的使用方法示例
Sep 29 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python程序封装为win32服务的方法
Mar 07 Python
详解python使用turtle库来画一朵花
Mar 21 Python
python实现证件照换底功能
Aug 20 Python
python中自带的三个装饰器的实现
Nov 08 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 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防注入漏洞过滤函数代码
2012/04/11 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
AngularJS初始化静态模板详解
2016/01/14 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
ansible作为python模块库使用的方法实例
2017/01/17 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
2020/10/15 Python
Python Pygame实现俄罗斯方块
2021/02/19 Python
销售人员中英文自荐信
2013/09/22 职场文书
职业生涯规划书范文
2014/03/10 职场文书
旅游安全协议书
2014/04/21 职场文书
ktv好的活动方案
2014/08/17 职场文书
群众路线领导对照材料
2014/08/23 职场文书
降价通知函
2015/04/23 职场文书
深入详解JS函数的柯里化
2021/06/09 Javascript
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL