Matplotlib中將兩條不同曲線共軸

如果兩條曲線中含有相同的變數,那麼可以把曲線畫在同一個坐標系中。比方橫軸均為時間,縱軸為兩個不同的振動的位移。但是如果兩個振動振幅相差太大,那麼另一個曲線就很不明顯。例如有如下兩個振動:

y_1=0.1*sin(t)\ y_2=100*e^{t}

這兩個振動如果畫在同一個axes下就會是下面的結果。

大家會看到由於第一個振動振幅太小,結果在圖上非常不明顯。那麼我們怎麼解決這個問題呢?當然就是再畫一幅圖,大家各自呆在自己的axes中。可是這樣一來,又有點浪費空間。Matplotlib提供了另外一種方案,利用右側的y軸,畫第二條曲線。

在Matplotlib中,實際上是有兩個x軸和兩個y軸的,默認使用下方的橫線為x軸,左側的豎線為y軸。但是可以利用twinx和twiny這兩個函數,代碼和圖如下。

from numpy import *from pylab import *t=linspace(0,2*pi,100)plot(t,0.1*sin(t),r-,label=r$y_1=0.1sin(t)$)legend(loc=5)xlabel(r$t$)ylabel(r$y_1$)twinx()plot(t,100*exp(t),b-,label=r$y_2=100e^t$)ylabel(r$y_2$)legend(loc=6,)show()

可以看到,為了生成每一條曲線的圖例,用了兩次legend這個函數。實際上在調用twinx這個函數的時候,相當於建立了另外一個axes,只是它與目前的axes共x軸。所以為了讓兩條曲線的label放在同一個圖例中,可以利用之前在圖例中討論過的方法,對代碼稍加修改得到下面的結果。

from numpy import *from pylab import *t=linspace(0,2*pi,100)L1,=plot(t,0.1*sin(t),r-,label=r$y_1=0.1sin(t)$)xlabel(r$t$)ylabel(r$y_1$)twinx()L2,=plot(t,100*exp(t),b-,label=r$y_2=100e^t$)ylabel(r$y_2$)legend(handles=[L1,L2],loc=9,)show()

這樣就可以將兩個數量級差距很大的曲線畫在同一幅圖中。類似還可以共享y軸。


推薦閱讀:

TAG:數據可視化 | Matplotlib | Python編程 |