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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
python输出指定月份日历的方法
Apr 23 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
Python实现简易Web爬虫详解
Jan 03 Python
python绘制多个子图的实例
Jul 07 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
Python统计时间内的并发数代码实例
Dec 28 Python
Python itertools.product方法代码实例
Mar 27 Python
浅析Python 多行匹配模式
Jul 24 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
Python 用户输入和while循环的操作
May 23 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
PHP parse_url 一个好用的函数
2009/10/03 PHP
PHP里的中文变量说明
2011/07/23 PHP
PHP向socket服务器收发数据的方法
2015/01/24 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
jQuery实现的回车触发按钮事件功能示例
2018/03/25 jQuery
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
python模块导入的方法
2019/10/24 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
元旦晚会邀请函
2014/02/01 职场文书
故宫的导游词
2015/01/31 职场文书
党支部工作总结2015
2015/04/01 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
浅谈MySQL user权限表
2021/06/18 MySQL
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS