Python實(shí)現(xiàn)雙軸組合圖表柱狀圖和折線圖的具體流程
Python繪制雙軸組合的關(guān)鍵在plt庫的twinx()函數(shù),具體流程:
1.先建立坐標(biāo)系,然后繪制主坐標(biāo)軸上的圖表;
2.再調(diào)用plt.twinx()方法;
3.最后繪制次坐標(biāo)軸圖表。
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 #設(shè)置坐標(biāo)軸數(shù)值以百分比(%)顯示函數(shù) def to_percent(temp, position): return '%1.0f'%(1*temp) + '%' #字體設(shè)置 font2 = {'family' : 'Times New Roman', 'weight' : 'normal', 'size' : 25, } conn=cx_Oracle.connect('用戶名/密碼@IP:端口/數(shù)據(jù)庫') 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查詢數(shù)據(jù) data=x.fetchall() #print(data) #新建Excel保存數(shù)據(jù) 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數(shù)據(jù) 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轉(zhuǎn)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軸坐標(biāo) x=np.arange(len(date1)) bar_width=0.35 plt.figure(1,figsize=(19,10)) #繪制主坐標(biāo)軸-柱狀圖 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) #設(shè)置主坐標(biāo)軸參數(shù) 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]) #調(diào)用plt.twinx()后可繪制次坐標(biāo)軸 plt.twinx() #次坐標(biāo)軸參考線 target1=[90]*len(date1) target2=[80]*len(date1) x=list(range(len(date1))) plt.xticks(x,date1,rotation=45) #繪制次坐標(biāo)軸-折線圖 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') #次坐標(biāo)軸刻度百分比顯示 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]#數(shù)據(jù) table_row=['RBT_MOVE','EQP_MOVE','USE_RATE(%)','UPTIME(%)']#行標(biāo)簽 table_col=date1#列標(biāo)簽 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參數(shù)設(shè)置-字體大小太小,自己設(shè)置 the_table.auto_set_font_size(False) the_table.set_fontsize(12) #Table參數(shù)設(shè)置-改變表內(nèi)字體顯示比例,沒有會(huì)溢出到表格線外面 the_table.scale(1,3) #plt.show() plt.savefig(r"E:\\ROBOT_30_DAYS_MOVE.png",bbox_inches='tight') #關(guān)閉SQL連接 c.close() conn.close()
結(jié)果顯示:
到此這篇關(guān)于Python實(shí)現(xiàn)雙軸組合圖表柱狀圖和折線圖的具體流程的文章就介紹到這了,更多相關(guān)python柱狀圖和折線圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCharm+PySpark遠(yuǎn)程調(diào)試的環(huán)境配置的方法
今天小編就為大家分享一篇PyCharm+PySpark遠(yuǎn)程調(diào)試的環(huán)境配置的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11對(duì)Python中range()函數(shù)和list的比較
下面小編就為大家分享一篇對(duì)Python中range()函數(shù)和list的比較,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python進(jìn)階教程之動(dòng)態(tài)類型詳解
這篇文章主要介紹了python進(jìn)階教程之動(dòng)態(tài)類型詳解,動(dòng)態(tài)類型是動(dòng)態(tài)語言的特性,本文對(duì)多種動(dòng)態(tài)類型應(yīng)用做了講解,需要的朋友可以參考下2014-08-08使用python實(shí)現(xiàn)抓取騰訊視頻所有電影的爬蟲
這篇文章主要介紹了使用python實(shí)現(xiàn)抓取騰訊視頻所有電影的爬蟲,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作示例
這篇文章主要介紹了Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作,結(jié)合實(shí)例形式分析了sqlalchemy模塊的安裝及連接、調(diào)用數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Flask框架運(yùn)用Ajax實(shí)現(xiàn)數(shù)據(jù)交互的示例代碼
使用Ajax技術(shù)網(wǎng)頁應(yīng)用能夠快速地將增量更新呈現(xiàn)在用戶界面上,而不需要重載刷新整個(gè)頁面,這使得程序能夠更快地回應(yīng)用戶的操作,本文將簡(jiǎn)單介紹使用AJAX如何實(shí)現(xiàn)前后端數(shù)據(jù)通信2022-11-11