欢迎访问 Lu程序设计

在Lu脚本中绘制共享X轴视图

目  录

1 基础知识 绘制共享X轴视图的基础知识。
2 基本绘图方式 共享X轴视图基本绘图方式。
3 设置属性 给共享X轴视图设置属性。虽然可以通过右键菜单设置属性,但这里是通过脚本函数设置属性。
4 让某一个子图动起来 在共享X轴视图的某一个子图中动态显示图形。
5 绘制矩阵或者二维数组的共享X轴图像 使用脚本函数luShareX(data)绘制,data是一个矩阵或者二维数组。 从文件中读取数据绘制图形。
6 绘制两个矩阵或者二维数组的共享X轴图像 使用脚本函数luShareX2(data1, data2)绘制,data1和data2是两个矩阵或者二维数组。用于比较data1和data2的差别。data1和data2列数可以不相同,但相同的列有相同的坐标轴;data1绘制点图,data2绘制折线图。

1 基础知识

    绘制共享X轴视图的程序结构如下:

!!!using("win","math");   //使用命名空间win和math。win是必须的,而math是多数情况下要用到的。
init(... ...) =          
//定义初始化函数init,函数参数根据需要设置。
{
  cwAttach(typeShareX),   
//函数cwAttach用于设置图像类型,typeShareX表示 共享X轴视图。
  cwResizePlots(... ...), //设置视图图层数量,见下面的说明。
  ... ...,                
//添加初始化数据或属性。
  cwSetLRAxis()        
//设置第一层显示左坐标轴,第二层显示右坐标轴。在当前CChart版本中,如果缺少此设置,将无法显示坐标轴。
};
ChartWnd[@init];         
//显示窗口并调用函数init进行初始化。

    函数 cwResizePlots(...):设置子图数量或图层数量。

    用法1:cwResizePlots(nLayers) //设置图层数量,用于分层视图、共享X轴视图,nLayers为大于0的整数。
    用法2:cwResizePlots(mode, nRows, nCols) //设置子图数量,用于分裂视图,其中mode(0~5)表示分裂模式;nRows(大于0)表示行数,nCols(大于0)表示列数,这两个参数只有mode为1时起作用。

    分裂视图的分裂模式:0表示不分裂;1表示行列分裂;2表示左一右二的三分裂;3表示左二右一的三分裂;4表示上一下二的三分裂;5表示上二下一的三分裂。

    返回值:逻辑值,true表示成功。

2 基本绘图方式

!!!using("win","math");
init(x,k) =
{
  cwAttach[typeShareX], cwResizePlots(3),
  //共享X轴视图为3层
  x=
linspace[-8.0, 8.0, 0.2],
  k=len(x),      
//函数len可获得x的长度
 
cwAddCurve{x, sin(x),    k, 0},
 
cwAddCurve{x, x-sin(x),  k, 1},
  cwAddCurve{x, x.*sin(x), k, 2},
  cwSetLRAxis()
};
ChartWnd[@init];

3 设置属性

!!!using("win","math");
init(a,b,c,k1,k2,k3,k4)=
{
  cwAttach[
typeShareX], cwResizePlots(3), //共享X轴视图为3层
  a=linspace[-8.0, 8.0, 100], b=linspace[-2.0, 5.0, 100], c=linspace[-10.0, -2.0, 100],
  k1=cwAddCurve{a, sin[a], 100,   0},
    //给0子图添加曲线k1
  k2=cwAddCurve{a, a-sin[a], 100, 0},
     //给0子图添加曲线k2
  k3=cwAddCurve{b, b-sin[b], 100, 1},
    //给1子图添加曲线k3
  k4=cwAddCurve{c, c.*sin[c], 100,2},     //给2子图添加曲线k4
 
cwSetAxisTitle("0子图Y轴", 0, 0),        //给0子图设置坐标轴标题
  cwSetAxisTitle("1子图Y轴", 0, 1),        //给1子图设置坐标轴标题
  cwSetAxisTitle("2子图Y轴", 0, 2),        //给2子图设置坐标轴标题
  cwSetTitle["曲线属性"],                  //设置主标题。
  cwSetUseLegend(true),
                    //设置使用图例
  cwSetDataTitle["曲线1",cwGetIndex(k1),0],
//设置k1曲线的图例
  cwSetDataTitle["曲线2",cwGetIndex(k2),0],
//设置k2曲线的图例
  cwSetDataTitle["曲线3",cwGetIndex(k3),1],
//设置k3曲线的图例
  cwSetDataTitle["曲线4",cwGetIndex(k4),2],
//设置k4曲线的图例
  cwSetLRAxis()

};
ChartWnd[@init];

4 让某一个子图动起来

!!!using("win","math");
f(x : max, static, k : nDataID, nPlot)=
//关键字static指出后面的k是一个静态变量,静态变量总是初始化为0。模块变量nDataID, nPlot记住所操作的曲线。
{
  max=500,
  x=linspace[-9.0, 9.0, max],
  cwUpdateCurveByID[nDataID, x.*sin(x), x.*cos(x).^2.0, ++k%(max+1), nPlot]
//++k%(max+1)中的运算符%表示求模
};
init(b,c :: nDataID, nPlot)=          
//模块变量nDataID, nPlot记住所操作的曲线。
{
  cwAttach[typeShareX], cwResizePlots(3),
//共享X轴视图为3层
  b=linspace[-2.0, 5.0, 100], c=linspace[-10.0, -2.0, 100],
  nPlot=0,                            
//模块变量nPlot赋值为0
  nDataID=cwAddCurve(nPlot),
          //模块变量nDataID赋值为给0子图添加的空曲线
  cwAddCurve{b, b-sin[b], 100, 1},    
//给1子图添加曲线
  cwAddCurve{c, c.*sin[c], 100, 2},   
//给2子图添加曲线
  cwSetTimer[@f, 100, true],          
//设置通过计时器触发调用的函数f;每隔100毫秒调用一次;true表示立即启动定时器。
  cwSetLRAxis()
};
ChartWnd[@init];

5 绘制矩阵或者二维数组的共享X轴图像

    [例子1]:按矩阵(数组)的列绘图

!!!using("win","math");
init(x)=
  matrix[
       //用一个矩阵形式的字符串对矩阵进行初始化
"
1 5 100
2 3 300
3 1 600
4 2 200
5 6 500
"
  ].luShareX();
ChartWnd[@init];

    [例子2]:当数据较多时,可以将数据保存在文件data1.txt中,程序运行时用函数GetFileName选择该文件,并用函数readtxt读取该文件。

    文件data1.txt的内容:

1 5 100
2 3 300
3 1 600
4 2 200
5 6 500

    Lu代码:

!!!using("win","math","sys");  //下面的readtxt是命名空间sys中的函数
init(x)= GetFileName().readtxt().matrix().luShareX();
 //读取文件data1.txt中的数据并转换为一个矩阵
ChartWnd[@init];

    [例子3]:按矩阵(数组)的行绘图

!!!using("win","math");
init(x)=
  x = matrix[
"
1    2    3    4    5
5    3    1    2    6
100  300  600  200  500
"
  ],
  luShareX(x');
     //x'求矩阵x的转置
ChartWnd[@init];

    [例子4]:对微分方程(组)的解绘图

!!!using("win","math");
f(t,r,f,dr,df,p)={dr=2*r-2*r*f, df=-f+r*f, 0};
//函数定义
init(x) = gsl_ode{@f,nil,0.0,linspace[0.0,10.0,100],ra1[1,3]}.luShareX(); 
//ode方程的解是一个二维数组
ChartWnd[@init];

6 绘制两个矩阵或者二维数组的共享X轴图像

    [例子1]:基本用法

!!!using("win","math");
init(x,y)=
  x=matrix[
"
1 5  100
2 3  300
3 1  600
4 2  200
5 6  500
"
  ],
  y=matrix[
"
1 4.9 110
2 3.0 300
3 1.2 595
4 2.0 210
5 5.9 510
"
  ],
  luShareX2(x, y);
ChartWnd[@init];

    [例子2]:参数拟合后绘图

    拟合公式:y = b1 * exp[b2/(x+b3)]
    拟合参数:b1,b2,b3
    数据:    x      y    (保存在文件data1.txt中)

5.000000E+01 3.478000E+04
5.500000E+01 2.861000E+04
6.000000E+01 2.365000E+04
6.500000E+01 1.963000E+04
7.000000E+01 1.637000E+04
7.500000E+01 1.372000E+04
8.000000E+01 1.154000E+04
8.500000E+01 9.744000E+03
9.000000E+01 8.261000E+03
9.500000E+01 7.030000E+03
1.000000E+02 6.005000E+03
1.050000E+02 5.147000E+03
1.100000E+02 4.427000E+03
1.150000E+02 3.820000E+03
1.200000E+02 3.307000E+03
1.250000E+02 2.872000E+03

    Lu代码:

!!!using["win","luopt","math","sys"];
f(b1, b2, b3 :: x,y)= sum{[ b1.*exp[b2./(x+b3)] - y].^2.0};
init(main : xyArray,
b1,b2,b3,xy : x,y)=
{
    xyArray=GetFileName().readtxt().matrix(),  //读取文件data1.txt中的数据并转换为一个矩阵
    x=xyArray(all:0), y=xyArray(all:1),       
//x和y取矩阵的列

   
b1=0.0, b2=0.0, b3=0.0,                    //拟合参数初始值为随机值
    Opt[@f, optstarter,&b1,&b2,&b3,0]
,         //Opt函数全局优化并获得返回值
    xy=matrix(len(x),2),
                       //创建一个矩阵,函数len用于获得对象大小
    xy
(all:0)= x,                              //矩阵第0列赋值
    xy
(all:1)= b1.*exp[b2./(x+b3)],            //矩阵第1列赋值
    luShareX2(xyArray, xy)
                     //绘制共享X轴视图
};
ChartWnd[@init];


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