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脚本将文字转换为图片的实例分享
Aug 29 Python
深入解析Python中的上下文管理器
Jun 28 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
python中kmeans聚类实现代码
Feb 23 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
Python拼接字符串的7种方式详解
Mar 19 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
Python3读写ini配置文件的示例
Nov 06 Python
python切割图片的示例
Nov 12 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 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/09/13 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
2017/05/04 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
python网络编程实例简析
2014/09/26 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
英国在线电子和小工具商店:TecoBuy
2018/10/06 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
好邻里事迹材料
2014/01/16 职场文书
医学生求职信
2014/07/01 职场文书
大学生职业生涯十年规划书范文
2014/09/17 职场文书
大学学生会辞职信
2015/05/13 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
小学班级标语口号大全
2015/12/26 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript