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线程创建和终止实例代码
Jan 20 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
python实现屏保计时器的示例代码
Aug 08 Python
Python3实现二叉树的最大深度
Sep 30 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
python 读取二进制 显示图片案例
Apr 24 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python3如何实现Win10桌面自动切换
Aug 11 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 Python
python多线程方法详解
Jan 18 Python
Python如何快速找到多个字典中的公共键(key)
Apr 29 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
url decode problem 解决方法
2011/12/26 PHP
基于php 随机数的深入理解
2013/06/05 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
PHP积分兑换接口实例
2015/02/09 PHP
PHP中addcslashes与stripcslashes函数用法分析
2016/01/07 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
js自定义事件代码说明
2011/01/31 Javascript
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
处理Python中的URLError异常的方法
2015/04/30 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
python操作oracle的完整教程分享
2018/01/30 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
Python实现疫情地图可视化
2021/02/05 Python
英国行业制服供应商:Alexandra
2019/09/14 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
linux面试题参考答案(11)
2012/05/01 面试题
职工年度考核评语
2014/12/31 职场文书
医学生自荐信范文
2015/03/05 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL