请选择 进入手机版 | 继续访问电脑版
楼主: caibirdcnb
18986 22

[问答] SAS新手求助关于SGPLOT如何画条形图 谢谢 [推广有奖]

caibirdcnb 发表于 2011-9-18 12:16:20 |显示全部楼层 |坛友微信交流群
jingju11,非常感谢!你说的对,我只需要改变代表RGB颜色的文本。
你的代码非常简洁有效,我现在能指定颜色了,谢谢!

感谢guoluo和jingju11的帮忙,下面是接近完成macro和效果图,我是初学者,所以写的代码相当幼稚,见笑了。
我现在存在的问题在于图片左上角的文字说明,有2方面:
第1个是样式,我所期望的效果如下,然而,如果我插入2个文字说明并分别指定不同的颜色,则2个文字说明会叠加在一起(只能指定位置为左上,左。。。不能指定特定位置)如果我插入1个文字说明并放置多行文字,则我不能为每行文字指定1种颜色。
D    ss=23355    mean=0.124     std=0.013
U    ss=17876    mean=0.123     std=0.014
第2个是不知道怎么从数据集里面提取并连接文字。汇总数据集如下图所示。我猜测应该是用类似下面的程序来实现,但是语法不熟悉,实现不了。
Snap4.jpg


  1. define a; /*不知道在macro里面怎么定义宏变量*/
  2. data xx;
  3.         do i = 1 to nobs; /*行数我知道怎么获取*/
  4.                         /*不知道哪个connect函数可以实现这个,如果
  5.                         只是普通字符,倒是可以用cats之类那些*/
  6.                 a = connect(UP_DOWN "  " ss "  " mean "  " std);
  7.         end;
  8. run;
复制代码



小数:
test13.jpeg


多组:
test24.jpeg


负数:
test31.jpeg


  1. libname temp "H:\SAS";

  2. %let _color_y = cx4F81BD cxC0504D cx9BBB59 cx8064A2 cx4BACC6 cxF79646;
  3. %let _color_y2 = cx4F81BD cxC0504D cx9BBB59 cx8064A2 cx4BACC6 cxF79646;
  4. /*%let _color_y2 = cx95B3D7 cxD99795 cxC2D69A cxB2A1C7 cx93CDDD cxFAC090; */

  5. %CDF(_in = temp.test, _var = par1, _group = UP_DOWN,
  6.                 _maverick_min = 0.05, _maverick_max = 0.25, _out = test1, _out_path = %str(H:\SAS));
  7. %CDF(_in = temp.test, _var = par2, _group = NO,
  8.                 _maverick_min = 0, _maverick_max = 100, _out = test2, _out_path = %str(H:\SAS));
  9. %CDF(_in = temp.test, _var = par3, _group = UP_DOWN,
  10.                 _maverick_min = -10, _maverick_max = 0, _out = test3, _out_path = %str(H:\SAS));

  11. %macro CDF (_in =, _var =, _group =, _maverick_min =, _maverick_max =, _out =, _out_path =);
  12. data _data_raw;
  13.         set &_in (keep = &_var &_group);
  14.         where &_var ^= .;
  15. run;

  16. data _tmp_no_maverick;
  17.         set _data_raw;
  18.         where &_var <= &_maverick_max and &_var >= &_maverick_min;
  19. run;

  20. %minmax(_in = _tmp_no_maverick, _var = &_var);
  21. %bin(_mean = &g_mean, _std = &g_std);

  22. data _tmp_bin;
  23.         set _data_raw;
  24.         bin = round(&_var, &g_bin);
  25. run;

  26. proc means data = _tmp_bin noprint;
  27.         var &_var;
  28.         class &_group bin;       
  29.         output out=_tmp_bin_sum (drop = _FREQ_)
  30.                 mean = mean
  31.                 std = std
  32.                 n = count;
  33.         options nolabel;
  34. run;
  35. %minmax(_in = _tmp_bin_sum, _var = _TYPE_);

  36. data _tmp_bin_count;
  37.         set _tmp_bin_sum;
  38.         where _TYPE_ = &g_max;
  39. run;
  40. proc sort data = _tmp_bin_count (drop = _TYPE_ mean std);
  41.         by &_group bin;
  42. run;

  43. data _tmp_bin_input (rename = (count = input));
  44.         set _tmp_bin_sum;
  45.         where _TYPE_ = &g_max - 1;
  46.         options nolabel;
  47. run;
  48. proc sort data = _tmp_bin_input (drop = bin _TYPE_ mean std);
  49.         by &_group;
  50. run;

  51. data _data_sum (rename = (bin = &_var));
  52.         merge _tmp_bin_count _tmp_bin_input;
  53.         by &_group;
  54.         per = 100 * count / input;
  55.         if &_group = lag1(&_group) then cdf + per;
  56.         else cdf = per;
  57. run;

  58. %minmax(_in = _tmp_no_maverick, _var = &_var);
  59. %xaxis(_mean = &g_mean, _std = &g_std, _max = &g_max, _min = &g_min);

  60. %minmax(_in = _data_sum, _var = count);
  61. %y2axis(_mean = &g_mean, _std = &g_std, _max = &g_max, _min = &g_min);

  62. %nobs_nvars(_in=_tmp_bin_input);
  63. proc means data = _tmp_no_maverick noprint;
  64.         var &_var;
  65.         class &_group;       
  66.         output out=_tmp_inset (where = (_TYPE_ = 1))
  67.                 n = ss
  68.                 mean = mean
  69.                 std = std;
  70.         options nolabel;
  71. run;
  72. proc sort data = _tmp_inset (drop = _TYPE_ _FREQ_);
  73.         by &_group;
  74. run;
  75.        
  76. data _tmp_inset;
  77.         update _tmp_inset _tmp_bin_input (rename = (input = ss));
  78.         by &_group;
  79. run;

  80. proc template;
  81.         define style nbCDF;
  82.            parent=Styles.Default;
  83.         style Graph from Graph /   
  84.                 OutputWidth = 8in
  85.               OutputHeight = 5.6in;
  86.         class color_list /
  87.               'bgA' = cxC0C0C0;
  88.         class GraphColors /
  89.                 'gwalls' = cxFFFFFF
  90.                 'glegend' = cxFFFFFF
  91.                 'ggrid' = cx909090
  92.                 %colorList;
  93.         class GraphFonts /
  94.                 'GraphDataFont' = ("<sans-serif>, <MTsans-serif>",14pt)
  95.               'GraphValueFont' = ("<sans-serif>, <MTsans-serif>",14pt)
  96.               'GraphLabelFont' = ("<sans-serif>, <MTsans-serif>",14pt)
  97.               'GraphFootnoteFont' = ("<sans-serif>, <MTsans-serif>",14pt)
  98.               'GraphTitleFont' = ("<sans-serif>, <MTsans-serif>",16pt,bold);
  99.     end;
  100. run;

  101. options jpegquality = 95;
  102. ods graphics on /imagefmt= JPEG
  103.                                  imagename="&_out";
  104. ods listing gpath="&_out_path"
  105.                          style=nbCDF;
  106. proc sgplot data = _data_sum;
  107.         series x = &_var y = cdf / group = &_group lineattrs = (pattern = solid thickness = 3) name = "y1";
  108.         series x = &_var y = count / y2axis group = &_group lineattrs = (pattern = longdash thickness = 2);
  109.         xaxis label = '&_var' grid fitpolicy = rotatethin values = (&g_xmin to &g_xmax by &g_xbin);
  110.         yaxis label = 'Cumulative Distribution(%)' grid values = (0 to 100 by 10);
  111.         y2axis label = 'Distribution(N)' grid values = (&g_y2min to &g_y2max by &g_y2bin);       
  112.         title "&_var CDF Plot by &_group";
  113.         inset "asdasdasda" "sdfsdfsd" / position = topleft;
  114.         *keylegend "y1" / position= bottom;
  115.         *footnote justify = right "XXX";
  116. run;
  117. ods listing close;
  118. ods graphics off;

  119. proc datasets library=work nolist;
  120.         delete  _tmp_no_maverick _stat _tmp_bin _tmp_bin_sum _tmp_bin_count _tmp_bin_input _tmp_inset _data_raw _data_sum;
  121. run;

  122. %mend CDF;

  123. %macro colorList;        
  124.         %do i =1 %to &g_obsnum;
  125.                 "gcdata&i" = %scan (&_color_y, &i)
  126.                 "gcdata%eval (&i + &g_obsnum)" = %scan (&_color_y2, &i)
  127.         %end;
  128. %mend colorList;

  129. %macro nobs_nvars (_in = );
  130. %global g_obsnum g_varnum;
  131. %let dsid = %sysfunc (open (&_in, i));  
  132. %let g_obsnum = %sysfunc (attrn (&dsid, nobs));
  133. %let g_varnum = %sysfunc (attrn (&dsid, nvars));
  134. %let rc = %sysfunc (close (&dsid));
  135. %mend nobs_nvars;

  136. %macro minmax(_in =, _var =);
  137. %global g_mean g_median g_min g_max g_std g_ss;
  138. proc means data = &_in noprint;
  139.         var &_var;
  140.         output out=_stat
  141.                 mean = g_mean
  142.                 median = g_median
  143.                 min = g_min
  144.                 max = g_max
  145.                 std = g_std
  146.                 n = g_ss;
  147. run;

  148. data _null_;
  149.    set _stat;
  150.    call symput('g_mean', g_mean);
  151.    call symput('g_median', g_median);
  152.    call symput('g_min', g_min);
  153.    call symput('g_max', g_max);
  154.    call symput('g_std', g_std);
  155.    call symput('g_ss', g_ss);
  156. run;
  157. %mend minmax;

  158. %macro bin(_mean =, _std = _max =, _min =);
  159. %global g_bin;
  160. data _null_;
  161.         mean = &_mean;
  162.         if mean < 0 then mean = abs(mean);
  163.         step = floor(log10(mean)) - 2;
  164.         step = 10 ** step;

  165.         min = &_mean - 3 * &_std;
  166.         max = &_mean + 3 * &_std;
  167.         bin = (max - min) / 50;
  168.         bin = round (bin, step);

  169.         call symput('g_bin', bin);
  170. run;
  171. %mend bin;


  172. %macro xaxis(_mean =, _std =, _max =, _min =);
  173. %global g_xmin g_xmax g_xbin;
  174. data _null_;
  175.         mean = &_mean;
  176.         if mean < 0 then mean = abs(mean);
  177.         step = floor(log10(mean)) - 1;
  178.         step = 10 ** step;

  179.         min = &_mean - 3 * &_std;
  180.         max = &_mean + 3 * &_std;
  181.         bin = (max - min) / 10;

  182.         min = round (min, step);
  183.         max = round (max, step);
  184.         bin = round (bin, step);

  185.         call symput('g_xmin', min);
  186.         call symput('g_xmax', max);
  187.         call symput('g_xbin', bin);
  188. run;
  189. %mend xaxis;


  190. %macro y2axis(_mean =, _std =, _max =, _min =);
  191. %global g_y2min g_y2max g_y2bin;
  192. data _null_;
  193.         max = &_max;
  194.         if max < 0 then max = abs(max);
  195.         step = floor(log10(max));
  196.         step = 10 ** step;

  197.         max = &_max * 1.1;

  198.         min = 0;
  199.         max = round (max, step);
  200.         bin = (max - min) / 10;

  201.         call symput('g_y2min', min);
  202.         call symput('g_y2max', max);
  203.         call symput('g_y2bin', bin);
  204. run;
  205. %mend y2axis;
复制代码



test31.jpeg
test24.jpeg
test13.jpeg

使用道具

jingju11 发表于 2011-9-18 13:42:52 |显示全部楼层 |坛友微信交流群
  1. data have;
  2.        LENGTH L1 L2 $12;
  3.         x =1  ; y =.    ; y1 =10; y2=.   ; L1 ='DDD33'; L2 =''; output;
  4.         x =1  ; y =.    ; y1=.     ; y2 =9.5; L1 =''; L2= 'UUUUU'; output;
  5.         x =10; y =10;                                              L2='         '; output;
  6.         x =0  ; y =0   ;                                                     output;
  7. run;
  8. proc sgplot noautolegend;        
  9.         scatter x =x y =y1 /markerchar =L1 markercharattrs =(color =red);
  10.         scatter x =x y =y2 /markerchar =L2 markercharattrs =(color =blue);
  11.         series  x =x y =y/lineattrs =(color =purple);
  12. run;
复制代码



用inset写入文本有时候很讨厌。试试以下code,先产生一个合适的数据集。
用空格链接A B C 三个变量,CATX(' ', A, B, C)
我有时候先画出一张图然后在用macro做复制。直接编写macro,有些事倍功半的感觉,也增加不必要的复杂。
京剧

使用道具

caibirdcnb 发表于 2011-9-18 17:18:25 |显示全部楼层 |坛友微信交流群
jingju11,非常感谢,我去试试。
按照你的思路,我需要使用类似如下的格式:
Inset "sdsddfdfsdfsdf" "";
Inset "" "sdsdfsdfsdfsdfsfd";
Inset "" "" "sdfsdfsfsdsfd";

我去试试利用你之前的第一次回复那个宏能不能产生上面的文字格式。

谢谢!

使用道具

guoluo 发表于 2011-9-18 21:08:54 |显示全部楼层 |坛友微信交流群
  1. data test;
  2.   do scale = 1, 2;
  3.     do x = -3 to 3 by 0.1;
  4.           pdf = exp(-0.5*x**2)/(sqrt(2*constant('pi'))*scale);
  5.           cdf = cdf('norm',x,0,sqrt(scale));
  6.           output;
  7.         end;
  8.   end;
  9. run;

  10. proc sgplot data=test nocycleattrs;
  11. series x = x y = pdf/group=scale lineattrs=(pattern=dash thickness=2);
  12. series x = x y = cdf/group=scale lineattrs=(pattern=solid thickness=2) y2axis;
  13. run;
复制代码

使用道具

guoluo 发表于 2011-9-18 22:14:02 |显示全部楼层 |坛友微信交流群
  1. data test;
  2.   do scale = 1, 2;
  3.     do x = -3 to 3 by 0.1;
  4.           pdf = exp(-0.5*x**2)/(sqrt(2*constant('pi'))*scale);
  5.           cdf = cdf('norm',x,0,sqrt(scale));
  6.           output;
  7.         end;
  8.   end;
  9. run;

  10. data _null_;
  11.   up_down='D'; ss=23355; mean=0.124; std=0.013;
  12.   call symputx('a',catt(up_down,' ss=',ss,' mean=',mean,' std=',std));
  13.   up_down='U'; ss=17876; mean=0.123; std=0.014;
  14.   call symputx('b',catt(up_down,' ss=',ss,' mean=',mean,' std=',std));
  15. run;


  16. proc template;
  17. define statgraph myplot;
  18.   begingraph;
  19.     mvar a b;
  20.     layout overlay;
  21.       SeriesPlot X=x Y=pdf / primary=true Group=scale Lineattrs=( Pattern=20 Thickness=2) LegendLabel="pdf";
  22.       SeriesPlot X=x Y=cdf / yaxis=y2 Group=scale Lineattrs=( Pattern=1 Thickness=2) LegendLabel="cdf";
  23.       Layout Gridded / Border=false halign=left valign=top;
  24.         Layout Gridded;
  25.           Entry halign=left a / PAD=(TOP=0  BOTTOM=0  LEFT=3  RIGHT=3) textattrs=(color=red);
  26.         endlayout;
  27.       endlayout;
  28.       Layout Gridded / Border=false halign=left valign=top;
  29.         Layout Gridded;
  30.           Entry halign=left b / PAD=(TOP=12  BOTTOM=12  LEFT=3  RIGHT=3) textattrs=(color=blue);
  31.         endlayout;
  32.       endlayout;
  33.     endlayout;
  34.   endgraph;
  35. end;
  36. run;

  37. proc sgrender data=test template=myplot;
  38. run;
复制代码

使用道具

caibirdcnb 发表于 2011-9-19 21:54:43 |显示全部楼层 |坛友微信交流群
guoluo,真的非常感谢!
我之前也看到过nocycleattrs这个选项,我还以为是指所有线都同一颜色呢,用了这个选项,我连RGB颜色什么的都不用去指定了,直接用默认模板画图都可以。谢谢!



另外,在上面的数据集中,我通过1个宏确定数据集的观测数目,也就是说分为几个组,然后在data _null_里面通过1个循环把上面的数据集提取为系列的宏变量,如下面代码所示,这时候我得到L1,L2这2个宏变量。但我的疑问是怎么通过某些循环将L1-Ln这几个变量代换你代码中的a,b呢?谢谢了!
  1. %macro nobs_nvars (_in = );
  2. %global g_obsnum g_varnum;
  3. %let dsid = %sysfunc (open (&_in, i));  
  4. %let g_obsnum = %sysfunc (attrn (&dsid, nobs));
  5. %let g_varnum = %sysfunc (attrn (&dsid, nvars));
  6. %let rc = %sysfunc (close (&dsid));
  7. %mend nobs_nvars;

  8. %nobs_nvars(_in=_tmp_bin_input);

  9. data _null_;
  10.         set _tmp_inset;
  11.            do i = 1 to &g_obsnum;
  12.                   call symputx('L'||left(_n_),catt(up_down,' ss=',ss,' mean=',mean,' std=',std));
  13.           end;
  14. run;
复制代码
我在想应该可以利用类似下面的代码实现,但不知道怎么用把L1-Ln分别嵌入到&Li的位置。请指教,谢谢!
proc template;define statgraph myplot;
  begingraph;
    mvar a b;
    layout overlay;
      SeriesPlot X=x Y=pdf / primary=true Group=scale Lineattrs=( Pattern=20 Thickness=2) LegendLabel="pdf";
      SeriesPlot X=x Y=cdf / yaxis=y2 Group=scale Lineattrs=( Pattern=1 Thickness=2) LegendLabel="cdf";
      Layout Gridded / Border=false halign=left valign=top;
        Layout Gridded;
                        %textList;
                endlayout;
      endlayout;

    endlayout;
  endgraph;
end;
run;

*......some macro of color list;


%macro textList;        
        %do i =1 %to &g_obsnum;
                        “Entry halign=left &Li / PAD=(TOP=0  BOTTOM=0  LEFT=3  RIGHT=3) textattrs=(color=&colorlist_i);"
        %end;;
%mend textList;

使用道具

caibirdcnb 发表于 2011-9-21 21:17:38 |显示全部楼层 |坛友微信交流群
感谢guoluo,jingju11,soporaeternus等网友的热心帮助,经过你们的指导,我的宏终于大体完成了。
这是我第一个作图的宏,有了这个基础,以后其它宏编写起来肯定会快多了,到时有疑难请各位继续多多指导啊。
万分感谢!

小结一下:
1. 通过下面代码可以自定义一个样式模板。
  1. proc template;
  2.         define style nbCDF;
  3.            parent=Styles.Default;
  4. ..........
复制代码
2. 通过下面代码可以做出任意图形。(先通过常规作图结合tmpfmt=path可以得到template,再修改template)
  1. ods listing style=nbCDF;
复制代码


这是效果图:
test31.jpeg
test21.jpeg



这是代码:
  1. libname temp "h:\sas";

  2. %CDF(_in = temp.test, _var = par2, _group = NO,
  3.                 _maverick_min = 0, _maverick_max = 100, _out = test2, _out_path = %str(H:\SAS));
  4. %CDF(_in = temp.test, _var = par3, _group = UP_DOWN,
  5.                 _maverick_min = -10, _maverick_max = 0, _out = test3, _out_path = %str(H:\SAS));

  6. %macro CDF (_in =, _var =, _group =, _maverick_min =, _maverick_max =, _out =, _out_path =);
  7. data _data_raw;
  8.         set &_in (keep = &_var &_group);
  9.         where &_var ^= .;
  10. run;

  11. data _tmp_no_maverick;
  12.         set _data_raw;
  13.         where &_var <= &_maverick_max and &_var >= &_maverick_min;
  14. run;

  15. %minmax(_in = _tmp_no_maverick, _var = &_var);
  16. %bin(_mean = &g_mean, _std = &g_std);

  17. data _tmp_bin;
  18.         set _data_raw;
  19.         bin = round(&_var, &g_bin);
  20. run;

  21. proc means data = _tmp_bin noprint;
  22.         var &_var;
  23.         class &_group bin;       
  24.         output out=_tmp_bin_sum (drop = _FREQ_)
  25.                 mean = mean
  26.                 std = std
  27.                 n = count;
  28.         options nolabel;
  29. run;
  30. %minmax(_in = _tmp_bin_sum, _var = _TYPE_);

  31. data _tmp_bin_count;
  32.         set _tmp_bin_sum;
  33.         where _TYPE_ = &g_max;
  34. run;
  35. proc sort data = _tmp_bin_count (drop = _TYPE_ mean std);
  36.         by &_group bin;
  37. run;

  38. data _tmp_bin_input (rename = (count = input));
  39.         set _tmp_bin_sum;
  40.         where _TYPE_ = &g_max - 1;
  41.         options nolabel;
  42. run;
  43. proc sort data = _tmp_bin_input (drop = bin _TYPE_ mean std);
  44.         by &_group;
  45. run;

  46. data _data_sum (rename = (bin = &_var));
  47.         merge _tmp_bin_count _tmp_bin_input;
  48.         by &_group;
  49.         per = 100 * count / input;
  50.         if &_group = lag1(&_group) then cdf + per;
  51.         else cdf = per;
  52. run;

  53. %minmax(_in = _tmp_no_maverick, _var = &_var);
  54. %xaxis(_mean = &g_mean, _std = &g_std, _max = &g_max, _min = &g_min);

  55. %minmax(_in = _data_sum, _var = count);
  56. %y2axis(_mean = &g_mean, _std = &g_std, _max = &g_max, _min = &g_min);

  57. %nobs_nvars(_in=_tmp_bin_input);
  58. proc means data = _tmp_no_maverick noprint;
  59.         var &_var;
  60.         class &_group;       
  61.         output out=_tmp_inset (where = (_TYPE_ = 1))
  62.                 n = ss
  63.                 mean = mean
  64.                 std = std;
  65.         options nolabel;
  66. run;
  67. proc sort data = _tmp_inset (drop = _TYPE_ _FREQ_);
  68.         by &_group;
  69. run;
  70.        
  71. data _tmp_inset;
  72.         update _tmp_inset _tmp_bin_input (rename = (input = ss));
  73.         by &_group;
  74. run;
  75. %deleteLn;
  76. %getString (_in = _tmp_inset);

  77. ods path sashelp.tmplmst(read) sasuser.templat(update);
  78. proc template;
  79.         define style nbCDF;
  80.            parent=Styles.Default;
  81.         style Graph from Graph /   
  82.                 OutputWidth = 7.5in
  83.               OutputHeight = 5.5in;
  84.         class color_list /
  85.               'bgA' = cxC0C0C0;
  86.         class GraphColors /
  87.                 'gwalls' = cxFFFFFF
  88.                 'glegend' = cxC0C0C0
  89.                 'ggrid' = cx909090;
  90.         class GraphFonts /
  91.                 'GraphDataFont' = ("<sans-serif>, <MTsans-serif>",14pt)
  92.               'GraphValueFont' = ("<sans-serif>, <MTsans-serif>",14pt)
  93.               'GraphLabelFont' = ("<sans-serif>, <MTsans-serif>",14pt,bold)
  94.               'GraphFootnoteFont' = ("<sans-serif>, <MTsans-serif>",12pt)
  95.               'GraphTitleFont' = ("<sans-serif>, <MTsans-serif>",16pt,bold);
  96.     end;
  97. run;

  98. options jpegquality = 95;
  99. ods graphics on / imagefmt= JPEG
  100.                                 imagename="&_out"
  101.                                 width=7.5in
  102.                                 height=5.5in;
  103. ods listing gpath="&_out_path"
  104.                         style=nbCDF;

  105. proc template;
  106.         define statgraph myplot;
  107.           begingraph;
  108.             mvar L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 L11 L12;
  109.                   entrytitle "&_var CDF Plot by &_group";
  110.                   entryfootnote halign=right "xxx";
  111.             layout overlay / yaxisopts = (griddisplay = on label = "CDF (%)"
  112.                                                                         linearopts = (tickvaluesequence = (start = 0 end = 100 increment = 10))
  113.                                                                         linearopts = (viewmin = 0 viewmax = 100))                                                                         
  114.                                                 y2axisopts = (griddisplay = on label = "Count (N)"
  115.                                                                         linearopts = (tickvaluesequence = (start = &g_y2min end = &g_y2max increment = &g_y2bin))
  116.                                                                         linearopts = (viewmin = &g_y2min viewmax = &g_y2max))
  117.                                                 xaxisopts = (griddisplay = on label = "&_var"
  118.                                                                         linearopts = (tickvaluesequence = (start = &g_xmin end = &g_xmax increment = &g_xbin))
  119.                                                                         linearopts = (viewmin = &g_xmin viewmax = &g_xmax));
  120.                         seriesplot x = &_var y = cdf / primary = true group = &_group
  121.                                                         lineattrs = ( pattern = 1 thickness = 3) name = "y1";
  122.                       seriesplot x = &_var y = count / yaxis = y2 group = &_group
  123.                                                         lineattrs = ( pattern = 5 thickness = 1) name = "y2";
  124.                      layout gridded / autoalign = (right) location = inside;
  125.                                 discretelegend "y1" / title = "" across = 1;
  126.                  endlayout;

  127.                       Layout Gridded / Border=false halign=left valign=top;
  128.                           entry halign = left L1 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx2A25D9 size = 12pt);
  129.                           entry halign = left L2 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cxB2182B size = 12pt);
  130.                           entry halign = left L3 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx01665E size = 12pt);
  131.                           entry halign = left L4 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx543005 size = 12pt);
  132.                          entry halign = left L5 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx9D3CDB size = 12pt);
  133.                          entry halign = left L6 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx7F8E1F size = 12pt);
  134.                           entry halign = left L7 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx2597FA size = 12pt);
  135.                           entry halign = left L8 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cxB26084 size = 12pt);
  136.                           entry halign = left L9 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cxD17800 size = 12pt);
  137.                           entry halign = left L10 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cx47A82A size = 12pt);
  138.                          entry halign = left L11 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cxB38EF3 size = 12pt);
  139.                          entry halign = left L12 / pad = (top = 2  bottom = 2 left = 3 right = 3) textattrs = (color = cxF9DA04 size = 12pt);
  140.                      endlayout;
  141.             endlayout;
  142.           endgraph;
  143. end;
  144. run;

  145. proc sgrender data = _data_sum template=myplot;
  146. run;

  147. ods listing close;
  148. ods graphics off;
  149. ods trace off;

  150. proc datasets library=work nolist;
  151.         delete  _tmp_no_maverick _stat _tmp_bin _tmp_bin_sum _tmp_bin_count _tmp_bin_input _tmp_inset _data_raw _data_sum;
  152. run;

  153. %mend CDF;

  154. %macro nobs_nvars (_in = );
  155. %global g_obsnum g_varnum;
  156. %let dsid = %sysfunc (open (&_in, i));  
  157. %let g_obsnum = %sysfunc (attrn (&dsid, nobs));
  158. %let g_varnum = %sysfunc (attrn (&dsid, nvars));
  159. %let rc = %sysfunc (close (&dsid));
  160. %mend nobs_nvars;

  161. %macro minmax(_in =, _var =);
  162. %global g_mean g_median g_min g_max g_std g_ss;
  163. proc means data = &_in noprint;
  164.         var &_var;
  165.         output out=_stat
  166.                 mean = g_mean
  167.                 median = g_median
  168.                 min = g_min
  169.                 max = g_max
  170.                 std = g_std
  171.                 n = g_ss;
  172. run;

  173. data _null_;
  174.    set _stat;
  175.    call symput('g_mean', g_mean);
  176.    call symput('g_median', g_median);
  177.    call symput('g_min', g_min);
  178.    call symput('g_max', g_max);
  179.    call symput('g_std', g_std);
  180.    call symput('g_ss', g_ss);
  181. run;
  182. %mend minmax;

  183. %macro bin(_mean =, _std = _max =, _min =);
  184. %global g_bin;
  185. data _null_;
  186.         mean = &_mean;
  187.         if mean < 0 then mean = abs(mean);
  188.         step = floor(log10(mean)) - 2;
  189.         step = 10 ** step;

  190.         min = &_mean - 3 * &_std;
  191.         max = &_mean + 3 * &_std;
  192.         bin = (max - min) / 50;
  193.         bin = round (bin, step);

  194.         call symput('g_bin', bin);
  195. run;
  196. %mend bin;

  197. %macro deleteLn;
  198. %do i = 1 %to 12;
  199.         %symdel L&i;
  200. %end;
  201. %mend deleteLn;

  202. %macro getString (_in =);
  203. data _null_;
  204.         set &_in;
  205.         length str $1000;
  206.         array _n _numeric_;
  207.         array _c _character_;
  208.     do over _c;
  209.                    if compress(upcase(vname(_c)))^="STR" then
  210.               str=catx(" ",str,catx("=",vname(_c),_c));
  211.     end;
  212.         do over _n;
  213.                 if abs(_n) < 1 then
  214.                         str = catx(" ", str, catx("=", vname(_n), put(_n, 10.3)));
  215.                 else if abs(_n) < 1000 then
  216.                         str = catx(" ", str, catx("=", vname(_n), put(_n, 10.1)));
  217.                 else
  218.                         str = catx(" ", str, catx("=", vname(_n), put(_n, 10.0)));
  219.         end;
  220.         call symputx(compress("L"||_N_),str);
  221.         %do i=1 %to &g_obsnum;
  222.                 %global L&i;
  223.         %end;
  224. run;
  225. %mend getString;

  226. %macro xaxis(_mean =, _std =, _max =, _min =);
  227. %global g_xmin g_xmax g_xbin;
  228. data _null_;
  229.         mean = &_mean;
  230.         if mean < 0 then mean = abs(mean);
  231.         step = floor(log10(mean)) - 1;
  232.         step = 10 ** step;

  233.         min = &_mean - 3 * &_std;
  234.         max = &_mean + 3 * &_std;
  235.         bin = (max - min) / 10;

  236.         min = round (min, step);
  237.         max = round (max, step);
  238.         bin = round (bin, step);

  239.         call symput('g_xmin', min);
  240.         call symput('g_xmax', max);
  241.         call symput('g_xbin', bin);
  242. run;
  243. %mend xaxis;


  244. %macro y2axis(_mean =, _std =, _max =, _min =);
  245. %global g_y2min g_y2max g_y2bin;
  246. data _null_;
  247.         max = &_max;
  248.         if max < 0 then max = abs(max);
  249.         step = floor(log10(max));
  250.         step = 10 ** step;

  251.         max = &_max * 1.1;

  252.         min = 0;
  253.         max = round (max, step);
  254.         bin = (max - min) / 10;

  255.         call symput('g_y2min', min);
  256.         call symput('g_y2max', max);
  257.         call symput('g_y2bin', bin);
  258. run;
  259. %mend y2axis;
复制代码

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
jingju11 + 1 + 1 + 1 精彩帖子/祝贺你。大家受益。。

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

jingju11 发表于 2011-9-21 21:29:29 |显示全部楼层 |坛友微信交流群
另外,我觉得你应该不是初学者吧?sas绘图这一块需要对sas概念和结构有一定的理解。我也感到你对问题的解决方法比较对路。
京剧

使用道具

caibirdcnb 发表于 2011-9-21 22:05:02 |显示全部楼层 |坛友微信交流群
算是初学者吧,呵呵。
我几年前很粗糙地学过SAS,学习的结果仅仅是了解界面,逻辑库和data,  proc, where, set, by这些语句;
2、3个月前比较认真地学过the little sas book,动机是原始数据很大,JMP处理不过来。学完后写了1个长度和上面这个差不多的宏,用于自动下载,整理,连接数据。处理完以后数据变小了,就又用JMP做统计和作图了;
上面这个程序是我写的第二个程序。我准备再写几个程序作图,例如binX-Y图,X-Y加spline图,有了这个程序的经验(作图)和第一个程序经验(处理数据),剩下的主要是一些体力劳动,对着帮助查找具体设置。
我现在面临最大的问题是宏变量这一块,基本概念都没掌握好,例如上面的程序,我就不知道哪些地方应该用%if哪些不能用%。
想认真从基本学起心态又急于求成,哎。请问有没有比较系统的SAS教程推荐啊?谢谢!

上面的程序没有你们的指导,根本无法完成啊。

上面写漏了:

2. 通过下面代码可以做出任意图形。(先通过常规作图结合tmpfmt=path可以得到template,再修改template)
  1. ods listing style=nbCDF;

  2. proc template;
  3.         define statgraph myplot;
  4.           begingraph;
复制代码

使用道具

a6566792 在职认证  发表于 2013-11-18 16:11:43 |显示全部楼层 |坛友微信交流群
厉害,正好遇到类似的问题,你的帖子完全帮助我解决了问题。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-17 03:19