1. 程式人生 > >python seaborn 共享x軸畫圖 資料視覺化

python seaborn 共享x軸畫圖 資料視覺化

最近實習資料分析需要畫兩個圖共享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軸,這句很關鍵!