在Lu脚本中用Plot绘制普通XY图

欢迎访问Lu程序设计

在Lu脚本中用Plot绘制普通XY图

目  录

1 基础知识Plot函数的基本用法。
2 绘制多条函数曲线需要自己双击窗口,或者单击右键,弹出菜单设置曲线的各种属性。
3 绘制多条函数曲线并用代码设置部分属性多次绘制同一图形时,用代码设置属性是方便的。
4 由内部计时器控制的动画可用于动态显示函数图形。
5 隐函数图形绘制隐函数图形。
6 按新设定的坐标轴重绘可在Plot函数窗口更改作图范围。
7 绘制含参变量的函数绘制含参变量的函数。
8 通过参数控制函数图形通过参数控制函数图形,也是一种绘制动态图形的方法。
9 普通数组图形绘制普通数组图形绘制。

10 内部计时器控制的数组图形绘制

内部计时器控制的数组图形绘制。

11 外部(计时器)控制的数组图形绘制外部(计时器)控制的数组图形绘制,横轴动态更新。

1 基础知识

    Plot函数可以绘制普通XY图,Plot函数的用法如下:

    Plot(Item1,Attribute1,Value1,Attribute2,Value2,...,Item2,Attribute3,Value3,Attribute4,Value4,... ...):动态绘制一元函数及数组图形

    Plot的参数有三种类型:

    (1)以I开头的参数为项目,例如Ix表示要设置X轴的绘图范围,Iufun表示要绘制一元函数图形等等;

    (2)以A开头的参数为项目的属性,例如Acolor表示要设置曲线的颜色;

    (3)以V开头的参数为属性的值,例如Vred表示曲线是红色的。

    所有参数的说明见下表:

I 类型的参数及用法说  明
win::Iauto程序退出时自动关闭Plot窗口。这是缺省设置。
win::Ihand程序退出时手动关闭Plot窗口。
win::Ixdynamic : bDynamic若bDynamic=true,则X轴绘图区间是动态的。若缺省该参数,相当于bDynamic=false。仅用于iarray、oarray类型的图形。
win::Iydynamic : bDynamic若bDynamic=true,则Y轴绘图区间是动态的,将自动绘制自变量范围内的函数完整图形。若缺省该参数,相当于bDynamic=true。
win::Ix : Xmin,Xmax设置X轴绘图区间。
win::Iy : Ymin,Ymax设置Y轴绘图区间。仅仅进行设置,Y轴绘图区间是否固定,取决于Iydynamic参数。
win::Igarray : hFor,... ...(其他属性设置)绘制普通数组图形。hFor为三元函数句柄,该函数具有f(x,y,n)的形式:x和y为等长的luData一维数组,n为需要绘制的数组元素个数 (n不能超过数组长度)。
win::Iiarray : hFor,... ...(其他属性设置)内部计时器控制绘制数组图形。hFor为四元函数句柄,该函数具有f(x,y,n,t)的形式:x和y为等长的luData一维数组,n为需要绘制的数组元素个数(n不能超过数组长度),t返回当前时间。若f(x,y,n,t)返回false,不再定时执行该函数。
win::Ioarray : hFor,... ...(其他属性设置)外部(计时器)控制绘制数组图形。hFor为四元函数句柄,该函数具有f(x,y,n,t)的形式:x和y为等长的luData一维数组,n为需要绘制的数组元素个数 (n不能超过数组长度),t返回当前时间。
win::Iufun : hFor,... ...(其他属性设置)可缺省win::Iufun。绘制一元函数图形。hFor为一元函数句柄,该函数具有f(x)的形式。
win::Iifun : hFor,... ...(其他属性设置)可缺省win::Iifun。绘制一元隐函数图形。hFor为二元函数句柄,该函数具有f(x,y)的形式。可能需要调整绘图点数Adots为合适的数值,才能得到理想的图形。
win::Ipfun : hFor,... ...(其他属性设置)可缺省win::Ipfun。绘制含参变量的函数图形。hFor为三元函数句柄,该函数具有f(u,x,y)的形式,u为参变量,x返回x(u)的值,y返回y(u)的值 。
win::Itimer : bRun,Ellapse设置内部计时器。若bRun=true,则启动绘图窗口后立即启动计时器;否则在绘图窗口手动启动计时器。Ellapse为计时间隔(毫秒)。
由于计时器可通过计时器窗口设置,故很少直接使用该函数。
win::Ititle : "标题"设置图形标题。
win::Ilable : "X轴说明","Y轴说明"设置X轴及Y轴说明。
win::Igrid : bDraw是否绘制网格。bDraw为true时绘制。缺省是不绘制。
win::Iaxisratio : xRatio,yRatio坐标轴比率。显示坐标轴数字时所乘的系数。缺省是1。
win::Iaxisshape : Vaxisshape坐标轴形状。有Vaxisnormal、Vaxissquare、Vaxisequal三种形状。默认是Vaxisnormal。
A 类型的参数及用法说  明
win::Aline绘制曲线图。这是缺省设置(Iifun除外)。
win::Adot绘制散点图。Iifun类型图形的缺省设置。
win::Adots,n设置绘图点数。仅用于Iufun、Iifun和Ipfun类型的图形。若缺省该参数,对Iufun和Ipfun图形,默认绘制500个点;对Iifun图形,默认绘制100个点。
win::Adotsmax,n设置绘图点数最大数。仅用于Iifun类型的图形。若缺省该参数,默认最多绘制10000个点。
win::Arange,min,max设置Iifun和Ipfun类型图形的参数变化范围。Iifun类型函数具有f(x,y)的形式,该参数用于设置y的估计变化范围,允许min==max,若缺省该参数,min和max取Y轴绘图区间(即Iy的设定值);Ipfun类型函数具有f(u,x,y)的形式,该参数用于设置u的变化范围。
win::Aprecision,eps设置Iifun类型隐函数的求解精度。若缺省该参数,默认求解精度为1e-6。
win::Acolor,Vcolor设置曲线(点)的颜色。曲线和点颜色的默认值由系统自动确定。
win::Amarker,marker设置曲线数据点标记是否显示。marker为true时显示。缺省是不显示。
win::Ashape,Vshape设置曲线(点)的形状。曲线和点形状的默认值由系统自动确定。
win::Alegend,"曲线(点)标记"设置曲线(点)的标记。将显示为图例。
V 类型的参数及用法说  明
win::Vsolid曲线形状为实线。
win::Vdash曲线形状为虚线。
win::Vdashdot曲线形状为点线。
win::Vdashdotdot曲线形状为点划线。
win::Vnull曲线形状为无。
win::Vinsideframe曲线形状为实线(边框线)。
win::Vnone点形状为空。
win::Vcircle点形状为空心圆。
win::Vsquare点形状为矩形。
win::Vdiamond点形状为菱形。
win::Vupt点形状为上三角。
win::Vdpt点形状为下三角。
win::Vlpt点形状为左三角。
win::Vrpt点形状为右三角。
win::Vfork点形状为×。
win::Vcross点形状为+。
win::Vbar点形状为实心圆点。
win::Vsdot点形状为实心圆点。
win::Vred红色。
win::Vyellow黄色。
win::Vgreen绿色。
win::Vblue蓝色。
win::Vgray灰色。
win::Vblack黑色。
win::Vaxisnormal坐标轴正常显示方式。
win::VaxissquareX轴和Y轴的单位长度相同。
win::Vaxisequal坐标轴图框呈正方形。

    返回值:0。

    运行错误:1:不可识别的参数类型标识;2:参数不匹配;3:参数不符合要求;4:非法的函数句柄;5:内存错误;6:非法是字符串参数;7:函数的参数个数太多或者太少。

    说明:

    目前Plot函数支持三种函数图形:

    (1)Igarray类型的数组,Iufun、Iifun和Ipfun类型的函数。此类图形仅在通过菜单命令更改设置时更新数据(例如改变了X轴的最小值),内部计时器及外部控制对此毫无影响。

    (2)Iiarray类型的数组。此类图形的更新仅受内部计时器的控制。

    (3)Ioarray类型的数组。此类图形的更新仅受外部(计时器)的控制。

2 绘制多条函数曲线

!!!using("win");
f(x)=sin(x);
g(x)=x-sin(x);
h(x)=x*sin(x);
Plot[Ix : -8.,8.,@f, @g, @h]; //绘制函数f、g和h的图形,Ix指出X轴绘图范围

    作为重要的练习,你可以通过双击窗口,或者单击右键,弹出菜单设置曲线的各种属性如下图的样式:

3 绘制多条函数曲线并用代码设置部分属性

!!!using("win");
f(x)=sin(x);
g(x)=x-sin(x);
h(x)=x*sin(x);
Plot{Ix : -8.,8.,
     Iufun : @f, Alegend,"sin[x]",  Amarker,true, Acolor,Vblue,
        //绘制函数f的图形并显示图例和标记
     Iufun : @g, Alegend,"x-sin[x]",Amarker,true, Acolor,RGB(0,255,0),
//绘制函数g的图形并显示图例和标记
     Iufun : @h, Alegend,"x*sin[x]",Amarker,true, Acolor,RGB(255,0,0),
//绘制函数h的图形并显示图例和标记
     Ititle : "自动设置绘图属性的例子",
  //显示标题
     Ilable : "X轴","Y轴"
               //显示坐标轴说明
};

4 由内部计时器控制的动画

!!!using("win","math");
//函数f将由Plot函数的定时器频繁调用,为保证f工作可靠和提高运行效率,自动管理了内存,没有使用Lu的垃圾收集器。
f(
x,y,n,t : u, max, static, k, xx, yy, free)=  //关键字static指出后面的k,xx,yy,free是一些静态变量,静态变量总是初始化为0。
{
  if[free, del(xx, yy), return(0)],
//表达式销毁时销毁全局动态变量xx和yy。Lu在销毁函数f前将自动设置专用静态变量free=1,然后自动执行f,使销毁仅执行一次。
  del[xx, yy],
          //销毁保存在xx和yy中的全局动态变量
  max=500,

  u=linspace[-9.0, 9.0, max],
  x=u.*sin(u), y=u.*cos(u).^2.0, n=++k%(max+1),
t=0.,  //++k%(max+1)中的运算符%表示求模
  global(x), global(y),
//将局部动态对象x和y转换为全局动态对象
  xx=x, yy=y,
           //用静态变量xx和yy记住全局动态对象
 
true
};
Plot{Ixdynamic : true,
     Iiarray : @f,Adot,Ashape,Vdiamond,Acolor,Vred,
     Itimer : true, 100
};

5 隐函数图形

    (1)隐函数图形:隐函数绘制时,调整Arange的范围大小有助于获得更准确的图形。

!!!using("win");
f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
  //二元函数确定了一个隐函数
Plot[Ix : -8.,8., Igrid : true,    //Igrid指出是否绘制网格
     @f, Arange,-8.,8., Adots,200];
//Arange指出Y的可能的变化范围,通常不能省略该参数;Adot指出绘图点数,绘图点数越多越准确

    (2)隐函数图形(x取-5~5,y取-5~5附近):f(x,y)=cos(x*y);

!!!using("win");
f(x,y)=cos(x*y);
Plot{Ix : -5.,5., Iy : -5.,5., Iydynamic : false, Igrid : true,
     Iifun : @f, Acolor,Vblue, Adots,300
};

    (3)隐函数图形(x取1.5~10,y取2附近):f(x,y)=ln(3.5*x^y)+x-y^x-(sin(y-x))^2+0.6-(x+y)^(0.1*x)/x;

!!!using("win");
f(x,y)=ln(3.5*x^y)+x-y^x-(sin(y-x))^2+0.6-(x+y)^(0.1*x)/x;
Plot{Ix : 1.5,8.,
Igrid : true,
     Iifun : @f,Arange,2.,2. 
//y取2附近
};

6 按新设定的坐标轴重绘

    以下用法非常简单,部分属性已经自动设置了,例如曲线的颜色;其余属性可通过菜单进行设置,例如:X轴的范围(X轴范围更改后,还要执行右键菜单“按新设定的坐标轴重绘”)。

f(x)=sin[10*x];     //一元函数
g(x)=x*sin[10*x];
   //一元函数
win::Plot[@f, @g];
 //绘制函数f和g的图形

7 绘制含参变量的函数

!!!using("win");
f(u,x,y)= x=u*sin[u],y=u*cos[u]^2;
    //三元函数确定了一个含参变量的函数,第一个参数u是参变量,x和y的返回值确定了一个点
Plot[Ix : -9.,9
., @f, Arange,-9.,9.];
//Arange指出参变量u的变化范围

8 通过参数控制函数图形

    先来学习一个函数SetPara:

    win::SetPara(hWin,hFor1,dx1,hFor2,dx2,... ...):设置可通过参数修改窗口修改的参数

    hWin:父窗口句柄。可以缺省该参数。
    hFor1,dx1,hFor2,dx2,... ...:hFor为二元函数句柄,该函数由SetPara的参数修改窗口调用,具有以下格式:

修改x(mode,dx::x)=  //mode为工作模式,整数;dx为增量,实数;x是一个模块变量
{
    if{mode==0, return(x)},
          //mode为0,返回x当前值;SetPara初始化时,会使用mode=0获得x的初值
    if{mode==1, x=x+dx, return(x)},
  //mode为1,使x增加dx并返回x当前值
    if{mode==2, x=x-dx, return(x)},
  //mode为2,使x减少dx并返回x当前值
    if{mode==3, x=dx,   return(x)},
  //mode为3,重置x为初值,返回值被忽略
    if{mode<0, ... 用户定义操作 ...]
  //mode小于0时,执行用户定义的操作
};

    该函数的作用是通过增量dx修改模块变量x,并执行某些操作。SetPara初始化时,将先调用 修改x(0,任意值) 以获得模块变量x的初值xx。SetPara的参数修改窗口有三个按钮:增加、减少、重置。

    【增加】:先执行修改x(1,dx),然后执行修改x(-1,任意值)
    【减少】:先执行
修改x(2,dx),然后执行修改x(-1,任意值)
    【重置】:先执行
修改x(3,xx),然后执行修改x(-1,任意值)

    运行错误:1:参数不匹配,函数参数个数太多或者太少;2:找不到全局函数,或者该函数不是二元函数,或者函数返回值不是一个实数;3:内存错误;4:参数不符合要求。

    例子:

!!!using("win");
init(::A,B,C)= A=2.,B=1.,C=0.;
    //初始化模块变量
A(m,x::A)= which{m==0:A, m==1:[A=A+x], m==2:[A=A-x], m==3:[A=x], PlotExe(0)};
 //修改模块变量A并刷新Plot窗口的函数
B(m,x::B)= which{m==0:B, m==1:[B=B+x], m==2:[B=B-x], m==3:[B=x], PlotExe(0)};
 //修改模块变量B并刷新Plot窗口的函数
C(m,x::C)= which{m==0:C, m==1:[C=C+x], m==2:[C=C-x], m==3:[C=x], PlotExe(0)};
 //修改模块变量C并刷新Plot窗口的函数
f(x::A,B,C)=A*sin[B*x+C];
g(u,x,y::A,B)= x=u*sin[u+A],y=u*cos[u*B]^2;
Plot{Ix : -5.,5.,
     Iufun : @f,Acolor,Vred,
     Ipfun : @g,Arange,-3.,3.
},
SetPara{GetWin(hPlot),
//获得Plot函数的窗口句柄。可以缺省该参数获得另一效果。
        @A,0.5,
        //使参数A可动态修改
        @B,0.5,
        //使参数B可动态修改
        @C,0.5
        //使参数C可动态修改
};

   图形如下所示(其动态效果需通过参数控制演示):

9 普通数组图形绘制

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n::A,B)= x=A,y=B,n=15;
ff(x,y,n)= f(&x,&y,&n);
g(x,y,n::A,B)= x=B,y=A,n=15;
Plot{Ix : -12.,12.,
     Igarray : @f,
       //绘制数组为曲线
     Igarray : @ff,Adot,
//绘制数组为散点图
     Igarray : @g,Ashape,Vdash,Acolor,Vred
//绘制数组为曲线
};

10 内部计时器控制的数组图形绘制

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20,if[i>50,return(false)],true;
   //函数f只运行50次
ff(x,y,n,t)= f(&x,&y,&n,&t);
g(x,y,n,t:static,i:A,B)= x=B,y=A,n=++i%20,true;
Plot{Ix : -12.,12.,
     Iiarray : @f,
     Iiarray : @ff,Adot,
     Iiarray : @g,Ashape,Vdash,Acolor,Vred
};

    图形如下所示(其动态效果需通过内部计时器控制演示:在Plot窗口,打开“计时器设置”窗口,点击开始按钮,观察动态图形):

11 外部(计时器)控制的数组图形绘制,横轴动态更新

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20;
ff(x,y,n,t)= f(&x,&y,&n,&t);
Plot{Ixdynamic : true,    
//X轴是动态的
     Ioarray : @f,
     Ioarray : @ff,Adot,Acolor,Vred
};
~~~:::a(:static,k) = PlotExe[],if[++k>=50,return(false)],true;
//~~~表示只编译,不执行;:::表示全局函数。PlotExe()用于执行用Ioarray注册到Plot的绘图函数。
~~~:::b() = PlotExe[],true;
FunTimer[];               
//打开外部定时器窗口,可使用计时器定时执行全局函数

    其动态效果需通过外部计时器控制演示:在FunTimer窗口,在计时器1的全局函数名输入窗口输入“a”,点击开始按钮,观察动态图形,直至图形自动停止更新;在计时器2的全局函数名输入窗口输入“b”,点击开始按钮,观察动态图形,该动态图形不会自动停止。


版权所有© Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com
  QQ:630715621
最近更新: 2013年12月08日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值