《Python科学计算》的作者
分类: Python/Ruby
2012-04-30 21:48:56
当一条曲线中存在跳变点时,如果直接用plot()绘图会用一条直线将跳变前后的点连接起来。若不想绘制跳变处的连接线,可在数组的跳变处插入Nan值,下面的程序演示了这一方法。
❶找到曲线中所有前后两个点的高度差大于0.05的下标,❷调用np.insert()在不连续点处插入np.nan。
在参数曲线中为了表示随着参数的增大,曲线的变化情况,需要在曲线上绘制箭头表示方向。
split_positions(x, y, n)计算曲线(x,y)上等距离的n个点,以及在这n个点上的曲线切线方向。❶首先计算曲线上每个小段的长度l,❷对l用np.cumsum()进行累加,得到到达曲线上每点时所走过的曲线长度cl。❸cl[-1]为曲线的总长度,将这个总长度等分为n-1等分,❹然后通过np.searchsorted()搜索每个等分点所对应的下标。❺最后通过等分处前后两个点计算出曲线在此处的切线方向。
对split_positions()得到的每个点调用pl.arrow()绘制箭头,将dx和dy乘以一个很小的数(此处为0.01)是为了只绘制箭头,好让箭头能刚好位于曲线之上。
在matplotlib中,图表的刻度的位置由Axis对象的major.locator属性决定,而子图对象Axes的xaxis和yaxis属性分别表示X轴和Y轴。
缺省使用AutoLocator计算刻度的位置,下面是其代码:
可以看出刻度数目由nbins决定,缺省值为9。nbins决定的是最大刻度线数,根据当前的显示范围和steps的设置,AutoLocator会自动调节刻度线数。
当刻度文本较长时,过多的刻度数会导致刻度文本不易看清,因此我们希望能修改缺省的刻度数目。但由上面的代码可知,我们无法通过修改matplotlib的参数配置修改缺省刻度数。这时可以通过重新定义AutoLocator.__init__()实现这一功能。
❶定义了一个和AutoLocator.__init__()类似的函数,只是将nbins参数改为4,❷然后将AutoLocator.__init__改为使用此函数。
要求实现的效果如下图所示,根据Y轴的范围,使用不同的颜色对区域进行填充。
填充区域的最小值和最大值由mintemps和maxtemps给出,而每个范围的颜色由colors给出:
填充区域可使用fill_between()实现,但是它只支持一种颜色,因此需要对每个颜色范围调用一次fill_between()。本题的难点在于如何计算整个区域与某个范围相交的部分。我们可以使用NumPy的线性插值函数interp()和裁剪函数clip()快速实现这一运算。下面是完整的源程序:
❶对mintemps和maxtemps用np.interp()进行线性插值,得到更细分的数据。❷对colors中的每个区域进行循环,并使用np.clip()对细分之后的最大值和最小值进行剪裁。❸调用pl.fill_between()使用指定的颜色对裁剪之后的区域进行填充。