python 用Matplotlib作圖中有多個Y軸
阿新 • • 發佈:2020-11-30
在作圖過程中,需要繪製多個變數,但是每個變數的數量級不同,在一個座標軸下作圖導致曲線變化很難觀察,這時就用到多個座標軸。本文除了涉及多個座標軸還包括Axisartist相關作圖指令、做圖中label為公式的表達方式、matplotlib中常用指令。
一、放一個官方例子先
from mpl_toolkits.axisartist.parasite_axes import HostAxes,ParasiteAxes import matplotlib.pyplot as plt import numpy as np fig = plt.figure(1) #定義figure,(1)中的1是什麼 ax_cof = HostAxes(fig,[0,0.9,0.9]) #用[left,bottom,weight,height]的方式定義axes,0 <= l,b,w,h <= 1 #parasite addtional axes,share x ax_temp = ParasiteAxes(ax_cof,sharex=ax_cof) ax_load = ParasiteAxes(ax_cof,sharex=ax_cof) ax_cp = ParasiteAxes(ax_cof,sharex=ax_cof) ax_wear = ParasiteAxes(ax_cof,sharex=ax_cof) #append axes ax_cof.parasites.append(ax_temp) ax_cof.parasites.append(ax_load) ax_cof.parasites.append(ax_cp) ax_cof.parasites.append(ax_wear) #invisible right axis of ax_cof ax_cof.axis['right'].set_visible(False) ax_cof.axis['top'].set_visible(False) ax_temp.axis['right'].set_visible(True) ax_temp.axis['right'].major_ticklabels.set_visible(True) ax_temp.axis['right'].label.set_visible(True) #set label for axis ax_cof.set_ylabel('cof') ax_cof.set_xlabel('Distance (m)') ax_temp.set_ylabel('Temperature') ax_load.set_ylabel('load') ax_cp.set_ylabel('CP') ax_wear.set_ylabel('Wear') load_axisline = ax_load.get_grid_helper().new_fixed_axis cp_axisline = ax_cp.get_grid_helper().new_fixed_axis wear_axisline = ax_wear.get_grid_helper().new_fixed_axis ax_load.axis['right2'] = load_axisline(loc='right',axes=ax_load,offset=(40,0)) ax_cp.axis['right3'] = cp_axisline(loc='right',axes=ax_cp,offset=(80,0)) ax_wear.axis['right4'] = wear_axisline(loc='right',axes=ax_wear,offset=(120,0)) fig.add_axes(ax_cof) ''' #set limit of x,y ax_cof.set_xlim(0,2) ax_cof.set_ylim(0,3) ''' curve_cof,= ax_cof.plot([0,1,2],label="CoF",color='black') curve_temp,= ax_temp.plot([0,3,label="Temp",color='red') curve_load,= ax_load.plot([0,[1,2,3],label="Load",color='green') curve_cp,= ax_cp.plot([0,40,25],label="CP",color='pink') curve_wear,= ax_wear.plot([0,[25,18,9],label="Wear",color='blue') ax_temp.set_ylim(0,4) ax_load.set_ylim(0,4) ax_cp.set_ylim(0,50) ax_wear.set_ylim(0,30) ax_cof.legend() #軸名稱,刻度值的顏色 #ax_cof.axis['left'].label.set_color(ax_cof.get_color()) ax_temp.axis['right'].label.set_color('red') ax_load.axis['right2'].label.set_color('green') ax_cp.axis['right3'].label.set_color('pink') ax_wear.axis['right4'].label.set_color('blue') ax_temp.axis['right'].major_ticks.set_color('red') ax_load.axis['right2'].major_ticks.set_color('green') ax_cp.axis['right3'].major_ticks.set_color('pink') ax_wear.axis['right4'].major_ticks.set_color('blue') ax_temp.axis['right'].major_ticklabels.set_color('red') ax_load.axis['right2'].major_ticklabels.set_color('green') ax_cp.axis['right3'].major_ticklabels.set_color('pink') ax_wear.axis['right4'].major_ticklabels.set_color('blue') ax_temp.axis['right'].line.set_color('red') ax_load.axis['right2'].line.set_color('green') ax_cp.axis['right3'].line.set_color('pink') ax_wear.axis['right4'].line.set_color('blue') plt.show()
該例子的作圖結果為:
二、實際繪製
在實際使用中希望繪製的多變數數值如下表所示:
為了實現這個作圖,經過反覆修改美化,程式碼如下:
1.匯入包
from mpl_toolkits.axisartist.parasite_axes import HostAxes,ParasiteAxes import matplotlib.pyplot as plt
2.匯入資料
x = ['ATL','LAX','CLT','LAS','MSP','DTW','PHX','DCA','SLC','ORD','DFW','PHL','PDX','DEN','IAH','BOS','SAN','BWI','MDW','IND'] k_in = [49.160,47.367,26.858,30.315,16.552,28.590,23.905,18.818,28.735,6.721,10.315,26.398,38.575,7.646,11.227,8.864,15.327,19.120,11.521,19.618] k_out = [38.024,19.974,25.011,22.050,30.108,18.327,20.811,28.464,23.72,8.470,4.119,10.000,25.158,7.851,10.450,11.130,15.441,7.519,20.819,32.825] p = [0.0537,0.0301,0.0306,0.0217,0.0229,0.0223,0.0218,0.0179,0.0155,0.0465,0.0419,0.0165,0.0091,0.0357,0.0232,0.0200,0.0129,0.0143,0.0113,0.0064] K = [4.6844,2.0296,1.5858,1.1347,1.0706,1.0442,0.9764,0.8447,0.8141,0.7066,0.6041,0.5990,0.5808,0.5534,0.5023,0.3992,0.3964,0.3799,0.3639,0.3331]
3.作圖並儲存,相關指令後有備註,可以幫助理解
fig = plt.figure(1) #定義figure ax_k = HostAxes(fig,share x ax_p = ParasiteAxes(ax_k,sharex=ax_k) ax_K = ParasiteAxes(ax_k,sharex=ax_k) #append axes ax_k.parasites.append(ax_p) ax_k.parasites.append(ax_K) ax_k.set_ylabel('$K_i^{in}\;/\;K_i^{out}$') ax_k.axis['bottom'].major_ticklabels.set_rotation(45) ax_k.set_xlabel('Airport') ax_k.axis['bottom','left'].label.set_fontsize(12) # 設定軸label的大小 ax_k.axis['bottom'].major_ticklabels.set_pad(8) #設定x軸座標刻度與x軸的距離,座標軸刻度旋轉會使label和座標軸重合 ax_k.axis['bottom'].label.set_pad(12) #設定x軸座標刻度與x軸label的距離,label會和座標軸刻度重合 ax_k.axis[:].major_ticks.set_tick_out(True) #設定座標軸上刻度突起的短線向外還是向內 #invisible right axis of ax_k ax_k.axis['right'].set_visible(False) ax_k.axis['top'].set_visible(True) ax_p.axis['right'].set_visible(True) ax_p.axis['right'].major_ticklabels.set_visible(True) ax_p.axis['right'].label.set_visible(True) ax_p.axis['right'].major_ticks.set_tick_out(True) ax_p.set_ylabel('${p_i}$') ax_p.axis['right'].label.set_fontsize(13) ax_K.set_ylabel('${K_i}$') K_axisline = ax_K.get_grid_helper().new_fixed_axis ax_K.axis['right2'] = K_axisline(loc='right',axes=ax_K,offset=(60,0)) ax_K.axis['right2'].major_ticks.set_tick_out(True) ax_K.axis['right2'].label.set_fontsize(13) fig.add_axes(ax_k) curve_k1,= ax_k.plot(list(range(20)),k_in,marker ='v',markersize=8,label="$K_i^{in}$",alpha = 0.7) curve_k2,k_out,marker ='^',label="$K_i^{out}$",alpha = 0.7) curve_p,= ax_p.plot(list(range(20)),p,marker ='P',label="${p_i}$",alpha = 0.7) curve_K,= ax_K.plot(list(range(20)),K,marker ='o',label="${K_i}$",alpha = 0.7,linewidth=3) plt.xticks(list(range(20)),x) # ax_k.set_xticks(list(range(20))) # ax_k.set_xticklabels(x) ax_k.axis['bottom'].major_ticklabels.set_rotation(45) # ax_k.set_rotation(90) # plt.xticks(list(range(20)),x,rotation = 'vertical') ax_p.set_ylim(0,0.06) ax_K.set_ylim(0,5) ax_k.legend(labelspacing = 0.4,fontsize = 10) #軸名稱,刻度值的顏色 ax_p.axis['right'].label.set_color(curve_p.get_color()) # 座標軸label的顏色 ax_K.axis['right2'].label.set_color(curve_K.get_color()) ax_p.axis['right'].major_ticks.set_color(curve_p.get_color()) # 座標軸刻度小突起的顏色 ax_K.axis['right2'].major_ticks.set_color(curve_K.get_color()) ax_p.axis['right'].major_ticklabels.set_color(curve_p.get_color()) # 座標軸刻度值的顏色 ax_K.axis['right2'].major_ticklabels.set_color(curve_K.get_color()) ax_p.axis['right'].line.set_color(curve_p.get_color()) # 座標軸線的顏色 ax_K.axis['right2'].line.set_color(curve_K.get_color()) plt.savefig('10.key metrics mapping.pdf',bbox_inches='tight',dpi=800) plt.show()
4.繪製結果
PS
該作圖是在Axisartist的基礎上完成的,一些平時常用的繪製指令在此處是無用的。經過查詢相關資料,https://www.osgeo.cn/matplotlib/tutorials/toolkits/axisartist.html 該網站可以提供一些用法的幫助。
以上就是python 用Matplotlib作圖中有多個Y軸的詳細內容,更多關於python Matplotlib作圖的資料請關注我們其它相關文章!