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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
深入浅析Python中的yield关键字
Jan 24 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
python3实现逐字输出的方法
Jan 23 Python
python3.7 的新特性详解
Jul 25 Python
Python requests.post方法中data与json参数区别详解
Apr 30 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
Smarty模板学习笔记之Smarty简介
2014/05/20 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
js获取视频时长代码
2014/04/10 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
基于js中this和event 的区别(详解)
2017/10/24 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
使用Python写一个小游戏
2018/04/02 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
工艺工程师工作职责
2013/11/23 职场文书
单位工作证明范文
2014/09/14 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
安全生产工作汇报
2014/10/28 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
深度好文:50条没人告诉你的人生经验,句句精辟
2019/08/22 职场文书