python seaborn 共享x軸畫圖 資料視覺化
阿新 • • 發佈:2019-01-24
最近實習資料分析需要畫兩個圖共享x軸,
我之前找到了matplotlib如何實現:http://www.developerq.com/article/1516290674
但是不知道如何移植到seaborn上,經過N次實驗終於找到方法了!
需求:折線圖和柱狀圖共享x軸,y軸雙座標,一側是折線圖的座標,一側是柱狀圖的座標。柱狀圖每個柱上有標註,折線圖每個點上有標註。
fig = plt.figure(figsize=[18,6])#設定圖片大小 ax1 = fig.add_subplot(111)#新增第一副圖 ax2 = ax1.twinx()#共享x軸,這句很關鍵! """ 畫WOE值隨hit_data變化的柱狀圖 """ sns.barplot(x='hit_data', y='sum_people', data=result.reset_index(),ax=ax1,alpha=0.8)#畫柱狀圖,注意ax是選擇畫布 rects = ax1.patches labels=result['labels']#一個series for rect, label in zip(rects, labels):#柱狀圖示記 height = rect.get_height() ax1.text(rect.get_x() +division(rect.get_width() , 2), height + 3, label, ha='center', va='bottom')#為每個柱寫標註 ax1.axes.set_ylabel(u"進件數", fontsize=15) ax1.axes.set_xlabel(u"{0} (單位:{1})".format(xName,xDanwei), fontsize=15) # 設定x 座標label """ 畫WOE值隨hit_data變化的折線圖 """ sns.pointplot(result.index, result['woe'], ax=ax2)#畫在ax2畫布上 for c in ax2.collections: # 這三行為折線圖的點加註釋 for of in c.get_offsets(): if(of[1]<0): dotlabel=1/math.e**of[1] else: dotlabel=math.e**of[1] ax2.annotate(round(dotlabel,2), of) ax2.plot([-1, x.max()+1],[0,0],color='r')#畫一條iv值(在ax2中)=0的紅線 ax2.axes.set_ylabel(u"好 woe值 壞", fontsize=15) # 設定y座標label ax2.axes.set_title(u"折線圖", fontsize=15) #plt.show() fig.savefig(u"rulesetid{0}ruleid{1}woe值隨{2}變化趨勢圖".format(str(rulesetid),str(ruleid),xName)) #儲存圖片 plt.close(fig)#把圖片釋放掉,否則迴圈批量跑的時候儲存圖片會產生重疊
關鍵:
1.畫圖的時候加ax引數選擇畫布
2.共享x軸時的畫圖可以理解為像PS的圖層!ax=ax1是一層畫布,ax=ax2是第二層畫布,因為先畫的ax1後畫的ax2,所以ax2覆蓋在ax1上面,這意味著折線圖覆蓋在柱狀圖上,當折線圖點的標註有柱狀圖柱的標註重合時,顯示折線圖點的標註,在上層的圖的座標軸在右側。同理,無論用seaborn畫什麼圖,加ax引數都可以選擇畫布。
3.ax2 = ax1.twinx()#共享x軸,這句很關鍵!