Python实现双轴组合图表柱状图和折线图的具体流程
作者:bellin124 发布时间:2021-08-24 03:23:33
标签:python,柱状图,折线图
Python绘制双轴组合的关键在plt库的twinx()函数,具体流程:
1.先建立坐标系,然后绘制主坐标轴上的图表;
2.再调用plt.twinx()方法;
3.最后绘制次坐标轴图表。
import cx_Oracle
import xlrd
import xlwt
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FuncFormatter
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#设置坐标轴数值以百分比(%)显示函数
def to_percent(temp, position):
return '%1.0f'%(1*temp) + '%'
#字体设置
font2 = {'family' : 'Times New Roman',
'weight' : 'normal',
'size' : 25,
}
conn=cx_Oracle.connect('用户名/密码@IP:端口/数据库')
c=conn.cursor()
#sql查询语句,多行用()括起来
sql_detail=("select substr(date1,6,10)date1,round(avg(r_qty))r_qty,round(avg(e_qty))e_qty,""round(avg(r_qty)/avg(e_qty),2)*100 userate,round(avg(uptime),2)*100 uptime from 表tp "
"tp where 条件 "
"group by date1 order by date1 ")
x=c.execute(sql_detail)
#获取sql查询数据
data=x.fetchall()
#print(data)
#新建Excel保存数据
xl=xlwt.Workbook()
ws=xl.add_sheet("ROBOT 30 DAYS MOVE ")
#ws.write_merge(0,1,0,4,"ROBOT_30_DAYS_MOVE")
for i,item in enumerate(data):
for j,val in enumerate(item):
ws.write(i,j,val)
xl.save("E:\\ROBOT_30_DAYS_MOVE.xls")
#读取Excel数据
data1 = xlrd.open_workbook( "E:\\ROBOT_30_DAYS_MOVE.xls")
sheet1=data1.sheet_by_index(0)
date1=sheet1.col_values(0)
r_qty=sheet1.col_values(1)
e_qty=sheet1.col_values(2)
userate=sheet1.col_values(3)
uptime=sheet1.col_values(4)
#空值处理
for a in r_qty:
if a=='':
a=0
for a in e_qty:
if a=='':
a=0
for a in userate:
if a=='':
a=0
for a in uptime:
if a=='':
a=0
#将list元素str转int类型
r_qty = list(map(int, r_qty))
e_qty = list(map(int, e_qty))
userate = list(map(int, userate))
uptime = list(map(int, uptime))
#添加平均值mean求平均
r_qty.append(int(np.mean(r_qty)))
e_qty.append(int(np.mean(e_qty)))
userate.append(int(np.mean(userate)))
uptime.append(int(np.mean(uptime)))
date1.append('AVG')
#x轴坐标
x=np.arange(len(date1))
bar_width=0.35
plt.figure(1,figsize=(19,10))
#绘制主坐标轴-柱状图
plt.bar(np.arange(len(date1)),r_qty,label='RBT_MOVE',align='center',alpha=0.8,color='Blue',width=bar_width)
plt.bar(np.arange(len(date1))+bar_width,e_qty,label='EQP_MOVE',align='center',alpha=0.8,color='orange',width=bar_width)
#设置主坐标轴参数
plt.xlabel('')
plt.ylabel('Move',fontsize=18)
plt.legend(loc=1, bbox_to_anchor=(0,0.97),borderaxespad = 0.)
#plt.legend(loc='upper left')
for x,y in enumerate(r_qty):
plt.text(x,y+100,'%s' % y,ha='center',va='bottom')
for x,y in enumerate(e_qty):
plt.text(x+bar_width,y+100,'%s' % y,ha='left',va='top')
plt.ylim([0,8000])
#调用plt.twinx()后可绘制次坐标轴
plt.twinx()
#次坐标轴参考线
target1=[90]*len(date1)
target2=[80]*len(date1)
x=list(range(len(date1)))
plt.xticks(x,date1,rotation=45)
#绘制次坐标轴-折线图
plt.plot(np.arange(len(date1)),userate,label='USE_RATE',color='green',linewidth=1,linestyle='solid',marker='o',markersize=3)
plt.plot(np.arange(len(date1)),uptime,label='UPTIME',color='red',linewidth=1,linestyle='--',marker='o',markersize=3)
plt.plot(np.arange(len(date1)),target1,label='90%target',color='black',linewidth=1,linestyle='dashdot')
plt.plot(np.arange(len(date1)),target2,label='80%target',color='black',linewidth=1,linestyle='dashdot')
#次坐标轴刻度百分比显示
plt.gca().yaxis.set_major_formatter(FuncFormatter(to_percent))
plt.xlabel('')
plt.ylabel('Rate',fontsize=18)
#图列
plt.legend(loc=2, bbox_to_anchor=(1.01,0.97),borderaxespad = 0.)
plt.ylim([0,100])
for x,y in enumerate(userate):
plt.text(x,y-1,'%s' % y,ha='right',va='bottom',fontsize=14)
for x,y in enumerate(uptime):
plt.text(x,y+1,'%s' % y,ha='left',va='top',fontsize=14)
plt.title("ROBOT 30 DAYS MOVE")
#图表Table显示plt.table()
listdata=[r_qty]+[e_qty]+[userate]+[uptime]#数据
table_row=['RBT_MOVE','EQP_MOVE','USE_RATE(%)','UPTIME(%)']#行标签
table_col=date1#列标签
print(listdata)
print(table_row)
print(table_col)
the_table=plt.table(cellText=listdata,cellLoc='center',rowLabels=table_row,colLabels=table_col,rowLoc='center',colLoc='center')
#Table参数设置-字体大小太小,自己设置
the_table.auto_set_font_size(False)
the_table.set_fontsize(12)
#Table参数设置-改变表内字体显示比例,没有会溢出到表格线外面
the_table.scale(1,3)
#plt.show()
plt.savefig(r"E:\\ROBOT_30_DAYS_MOVE.png",bbox_inches='tight')
#关闭SQL连接
c.close()
conn.close()
结果显示:
来源:https://www.cnblogs.com/bellin124/p/14610744.html


猜你喜欢
- 本文实例讲述了Python实现连接MySql数据库及增删改查操作。分享给大家供大家参考,具体如下:在本文中介绍 Python3 使用PyMy
- 本文实例为大家分享了python绘制立方体的具体代码,供大家参考,具体内容如下#!/usr/bin/env python# This is
- import sysimport urllibfrom urllib import requestimport osfrom bs4 imp
- 00 小编的问题小编向我们反馈,从微信里复制出来的图片,会被微信屏蔽,无法显示我们后天采用的是百度编辑器,而且已经做了远程图片本地化,于是检
- 1、标准转换格式符号说明%a 本地星期的短名称 如:Sun, Mon, ..., Sat (en_US); So, Mo, ..., Sa
- 一、用属性替代 getter 或 setter 方法以下代码中包含手动实现的 getter(get_ohms) 和 setter(set_o
- 学习目的: 掌握最基本的Label、TextBox、Button控件用法 掌握用StringBuider类连接字符串 理解服务器的环境变量
- 1.setting--version control--subversion,按照图中红色字体填入对应信息2.配置中途遇到没找到svn.ex
- 本文实例为大家分享了PyQt5实现简单计算器的具体代码,供大家参考,具体内容如下下面我们将介绍使用python的PyQt5图形界面来编写一个
- 购物车程序要求如下图代码# --*--coding:utf-8--*--# Author: 村雨import pprintproductLi
- 随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NI
- 1、快捷键win+r输入cmd回车调出cmd界面,在命令行输入python回车,显示python命令无法识别2、登陆python官网http
- 当前记录集不支持更新。这可能是提供程序的限制,也可能是选定锁定类型的限制 问题的解决方法如下:第一:ACC
- 这篇文章主要介绍了python的time模块和datetime模块实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参
- 一、PyTorch批训练1. 概述PyTorch提供了一种将数据包装起来进行批训练的工具——DataLoader。使用的时候,只需要将我们的
- 迭代器模式迭代器模式(Iterator Pattern)是一种常用的设计模式,用于遍历集合中的元素,不暴露集合的内部结构。迭代器模式将集合和
- 前言之前缺乏移动端的经验。一直不知道上拉加载,下拉刷新是怎么实现的。现在正好有个产品有这样一个需求。想了一会没有思路。就去找插件。啥vue-
- 一、匹配版本基于Camunda 7.16.0 + Springboot 2.5.8首先我们去官网找到camunda7.16对应的spring
- 部署网站前查看一下系统是否已经安装CGI1、启动iis服务器,打开IIS服务器打开IIS服务器,点击网站,右击“添加网站”2、创建网站点击“
- 什么是高阶函数高阶函数就是能够把函数当成参数传递的函数就是高阶函数,换句话说如果一个函数的参数是函数,那么这个函数就是一个高阶函数。高阶函数