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爬取Coursera课程资源的详细过程
Nov 04 Python
Python最长公共子串算法实例
Mar 07 Python
Python字符串处理之count()方法的使用
May 18 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
Python星号*与**用法分析
Feb 02 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
python 实现倒排索引的方法
Dec 25 Python
Python Flask框架扩展操作示例
May 03 Python
python二进制文件的转译详解
Jul 03 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
详解python日志输出使用配置文件格式
Feb 10 Python
python前后端自定义分页器
Apr 13 #Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Python matplotlib多个子图绘制整合
Python之matplotlib绘制折线图
Python之matplotlib绘制饼图
Python线程池与GIL全局锁实现抽奖小案例
Python之Matplotlib绘制热力图和面积图
You might like
怎样辨别一杯好咖啡
2021/03/03 新手入门
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
CSS和Javascript简单复习资料
2010/06/29 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
vue内置指令详解
2018/04/03 Javascript
Python调用C# Com dll组件实战教程
2017/10/12 Python
3种python调用其他脚本的方法
2020/01/06 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
小学新教师培训方案
2014/02/03 职场文书
2014年消防工作实施方案
2014/02/20 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
家庭贫困证明
2014/09/23 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
销售员自我评价
2015/03/11 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
2016年度员工工作表现评语
2015/12/02 职场文书
关于战胜挫折的名言警句大全!
2019/07/05 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书