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()
結果顯示:
到此這篇關於Python實現雙軸組合圖表柱狀圖和折線圖的具體流程的文章就介紹到這瞭,更多相關python柱狀圖和折線圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python繪制堆疊條形圖介紹
- Python數據分析之使用matplotlib繪制折線圖、柱狀圖和柱線混合圖
- python數據分析之單因素分析線性擬合及地理編碼
- 利用Matplotlib實現單畫佈繪制多個子圖
- 利用Python matplotlib繪制風能玫瑰圖