zoukankan      html  css  js  c++  java
  • 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()

    结果显示:

  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/bellin124/p/14610744.html
Copyright © 2011-2022 走看看