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的Flask框架的简介和安装方法
Nov 13 Python
Python3.2模拟实现webqq登录
Feb 15 Python
Python中函数参数设置及使用的学习笔记
May 03 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
Python入门学习指南分享
Apr 11 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
Python命令行click参数用法解析
Dec 19 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python decorator拦截器代码实例解析
Apr 04 Python
python实现五子棋程序
Apr 24 Python
Python测试框架pytest高阶用法全面详解
Jun 01 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
PHP入门速成教程
2007/03/19 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
键盘 keycode的值 javascript时触发事件时很有用的要素
2009/11/02 Javascript
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
Javascript中call的两种用法实例
2013/12/13 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
Jquery Easyui验证组件ValidateBox使用详解(20)
2016/12/18 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
JavaScript寄生组合式继承实例详解
2018/01/06 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
讲解Python中if语句的嵌套用法
2015/05/14 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
2016/07/02 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
python的数学算法函数及公式用法
2020/11/18 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
大韩航空官方网站:Korean Air
2017/10/25 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
Linux Interview Questions For software testers
2013/05/17 面试题
应聘医药代表职位求职信
2013/10/21 职场文书
物流专业大学应届生求职信
2013/11/03 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
暑期社会实践新闻稿
2015/07/17 职场文书
大学班长竞选稿
2015/11/20 职场文书
高中英语教学反思范文
2016/03/02 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技
MongoDB使用场景总结
2022/02/24 MongoDB