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.1\sin(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.1\sin(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轴。