Python Matplotlib绘制两个Y轴图像


Posted in Python onApril 13, 2022

双Y轴图简介

 双Y轴图顾名思义就是在一个图里有两个Y轴。这种图形主要用来展示两个因变量和一个自变量的关系并且两个因变量的数值单位还不同。如我们想要展示不同月份公司销业绩以及成本的变化情况这时就可以用双Y轴图来展示。(因变量销量和成本具有不同的单位)。

实现思路

绘制双y轴的思想,也是用到了matplotlib面向对象绘图的思想。在不指定位置的情况下,在一个画布上创建出两个坐标系,其中第一个坐标系正常创建,第二个坐标系则使用专有的twinx()方法创建。

则两个坐标系的位置重合。第一个坐标系轴在左,通过twinx()方法创建出的坐标系则轴在右。因为有了两个y轴,所以再对y轴属性进行操作的时候,则需要面向对象,如果再简单地使用plt.ylabel()等方法,则只能操作到左轴,而影响不到右轴。

下边做一个示例,首先是导包和准备数据,这里准备一组销量数据,并计算其增长率,将其体现在右轴。

实现代码

样式一

具体代码如下:

import matplotlib.pyplot as plt
# 生成一组数据
x = range(7)
y1 = [2000, 1600, 3000, 6200, 7000, 9800, 11000]
y2 = [1]
for i in range(len(y1)):
    if i+1 == len(y1):
        break
    rate = round(y1[i+1]/y1[i] - 1, 2)
    y2.append(rate)

fig = plt.figure(figsize=(10, 8), facecolor='#ff33ff')
# 字体使用楷体
plt.rcParams['font.sans-serif'] = ['STKAITI']
plt.rcParams['axes.unicode_minus'] = False
# 背景色为cc00ff
plt.rcParams['axes.facecolor'] = '#cc00ff'
ax1 = fig.add_subplot(111)
plt.title('销售量及其增长率图示', color='#ffff00', fontsize=25, y=1.04)
plt.xticks(x, ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], color='#ffff00', fontsize=15)
plt.xlabel('月份', color='#ff0033', fontsize=15)
plt.yticks(color='#B22222', fontsize=15)
ax1.bar(x, y1, color='#33ff66', label='left')
ax1.set_ylabel('销售量(件)', color='#66ff00', fontsize=20)
# 增加一条坐标轴
ax2 = ax1.twinx()
ax2.plot(x, y2, color='#3399ff', linestyle='--', marker='o', linewidth=2)
ax2.set_ylabel("增长率", color='#66ff00', fontsize=20)
ax2.tick_params(axis='y', color='green', labelsize=15, labelcolor='#B22222')
for a, b in zip(x, y2):
    plt.text(a, b+0.02, '%.2f' % b, ha='center', va='bottom', fontsize=15, color='red')
plt.show()

图像效果如下图:

Python Matplotlib绘制两个Y轴图像

样式二

具体实现代码如下

%matplotlib inline
import matplotlib.pyplot as plt
import random
import pandas as pd
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
#数据准备
date=["一月","二月","三月","四月","五月","六月","七月","八月"]
sales=[random.randint(10000,25000) for i in range(8)]
cost=[int(i/100)-random.randint(1,20) for i in sales]
df=pd.DataFrame(data={"销量":sales,"成本":cost},index=date)
 
#绘制第一个Y轴
fig=plt.figure(figsize=(20,8),dpi=80)
ax=fig.add_subplot(111)
lin1=ax.plot(df.index,df["销量"],marker="o",label="sales")
ax.set_title("双Y轴图",size=20)
ax.set_xlabel("时间",size=18)
ax.set_ylabel("销量(件)",size=18)
for i,j in df["销量"].items():
    ax.text(i,j+20,str(j),va="bottom",ha="center",size=15)
 
#绘制另一Y轴    
ax1=ax.twinx()
lin2=ax1.plot(df.index,df["成本"],marker="o",color="red",label="cost")
ax1.set_ylabel("成本(元)",size=18)
 
#合并图例
lins=lin1+lin2
labs=[l.get_label() for l in lins]
ax.legend(lins,labs,loc="upper left",fontsize=15)
 
plt.show()

图像效果如下图:

Python Matplotlib绘制两个Y轴图像

到此这篇关于Python+Matplotlib绘制双y轴图像的示例代码的文章就介绍到这了!

Python 相关文章推荐
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
Feb 27 Python
python集合是否可变总结
Jun 20 Python
python 获取sqlite3数据库的表名和表字段名的实例
Jul 17 Python
python join方法使用详解
Jul 30 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
python动态规划算法实例详解
Nov 22 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
收音机术语解释
2021/03/01 无线电
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP多文件上传实例
2015/07/09 PHP
php获取远程文件大小
2015/10/20 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
PHP实现微信对账单处理
2018/10/01 PHP
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
详解JavaScript中void语句的使用
2015/06/04 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
python实发邮件实例详解
2019/11/11 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
python为什么会环境变量设置不成功
2020/06/23 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Under Armour安德玛德国官网:美国高端运动科技品牌
2019/03/09 全球购物
高中毕业生自我鉴定
2013/11/03 职场文书
中英文求职信范文
2014/01/27 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
校友会致辞
2015/07/30 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL