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魔法方法-自定义序列详解
Jul 21 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
详解python中的json和字典dict
Jun 22 Python
Python中正则表达式的用法总结
Feb 22 Python
快速排序的四种python实现(推荐)
Apr 03 Python
Python2与Python3的区别实例分析
Apr 11 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
使用python 对验证码图片进行降噪处理
Dec 18 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
Python中logger日志模块详解
Aug 04 Python
pandas参数设置的实用小技巧
Aug 23 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
jQuery功能函数详解
2015/02/01 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
让你彻底掌握es6 Promise的八段代码
2017/07/26 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
Python中的localtime()方法使用详解
2015/05/22 Python
编写Python脚本抓取网络小说来制作自己的阅读器
2015/08/20 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
Django跨域请求CSRF的方法示例
2018/11/11 Python
Python字符串的修改方法实例
2019/12/19 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
什么是Python中的匿名函数
2020/06/02 Python
pandas实现导出数据的四种方式
2020/12/13 Python
过程装备与控制工程专业个人的求职信
2013/12/01 职场文书
服务生自我鉴定
2014/01/22 职场文书
母亲追悼会答谢词
2014/01/27 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server