1. 程式人生 > 程式設計 >python 用Matplotlib作圖中有多個Y軸

python 用Matplotlib作圖中有多個Y軸

在作圖過程中,需要繪製多個變數,但是每個變數的數量級不同,在一個座標軸下作圖導致曲線變化很難觀察,這時就用到多個座標軸。本文除了涉及多個座標軸還包括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()

該例子的作圖結果為:

python 用Matplotlib作圖中有多個Y軸

二、實際繪製

在實際使用中希望繪製的多變數數值如下表所示:

python 用Matplotlib作圖中有多個Y軸

為了實現這個作圖,經過反覆修改美化,程式碼如下:

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.繪製結果

python 用Matplotlib作圖中有多個Y軸

PS

該作圖是在Axisartist的基礎上完成的,一些平時常用的繪製指令在此處是無用的。經過查詢相關資料,https://www.osgeo.cn/matplotlib/tutorials/toolkits/axisartist.html 該網站可以提供一些用法的幫助。

以上就是python 用Matplotlib作圖中有多個Y軸的詳細內容,更多關於python Matplotlib作圖的資料請關注我們其它相關文章!