你的代码非常简洁有效,我现在能指定颜色了,谢谢!
感谢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个是不知道怎么从数据集里面提取并连接文字。汇总数据集如下图所示。我猜测应该是用类似下面的程序来实现,但是语法不熟悉,实现不了。
- define a; /*不知道在macro里面怎么定义宏变量*/
- data xx;
- do i = 1 to nobs; /*行数我知道怎么获取*/
- /*不知道哪个connect函数可以实现这个,如果
- 只是普通字符,倒是可以用cats之类那些*/
- a = connect(UP_DOWN " " ss " " mean " " std);
- end;
- run;
小数:
多组:
负数:
- libname temp "H:\SAS";
- %let _color_y = cx4F81BD cxC0504D cx9BBB59 cx8064A2 cx4BACC6 cxF79646;
- %let _color_y2 = cx4F81BD cxC0504D cx9BBB59 cx8064A2 cx4BACC6 cxF79646;
- /*%let _color_y2 = cx95B3D7 cxD99795 cxC2D69A cxB2A1C7 cx93CDDD cxFAC090; */
- %CDF(_in = temp.test, _var = par1, _group = UP_DOWN,
- _maverick_min = 0.05, _maverick_max = 0.25, _out = test1, _out_path = %str(H:\SAS));
- %CDF(_in = temp.test, _var = par2, _group = NO,
- _maverick_min = 0, _maverick_max = 100, _out = test2, _out_path = %str(H:\SAS));
- %CDF(_in = temp.test, _var = par3, _group = UP_DOWN,
- _maverick_min = -10, _maverick_max = 0, _out = test3, _out_path = %str(H:\SAS));
- %macro CDF (_in =, _var =, _group =, _maverick_min =, _maverick_max =, _out =, _out_path =);
- data _data_raw;
- set &_in (keep = &_var &_group);
- where &_var ^= .;
- run;
- data _tmp_no_maverick;
- set _data_raw;
- where &_var <= &_maverick_max and &_var >= &_maverick_min;
- run;
- %minmax(_in = _tmp_no_maverick, _var = &_var);
- %bin(_mean = &g_mean, _std = &g_std);
- data _tmp_bin;
- set _data_raw;
- bin = round(&_var, &g_bin);
- run;
- proc means data = _tmp_bin noprint;
- var &_var;
- class &_group bin;
- output out=_tmp_bin_sum (drop = _FREQ_)
- mean = mean
- std = std
- n = count;
- options nolabel;
- run;
- %minmax(_in = _tmp_bin_sum, _var = _TYPE_);
- data _tmp_bin_count;
- set _tmp_bin_sum;
- where _TYPE_ = &g_max;
- run;
- proc sort data = _tmp_bin_count (drop = _TYPE_ mean std);
- by &_group bin;
- run;
- data _tmp_bin_input (rename = (count = input));
- set _tmp_bin_sum;
- where _TYPE_ = &g_max - 1;
- options nolabel;
- run;
- proc sort data = _tmp_bin_input (drop = bin _TYPE_ mean std);
- by &_group;
- run;
- data _data_sum (rename = (bin = &_var));
- merge _tmp_bin_count _tmp_bin_input;
- by &_group;
- per = 100 * count / input;
- if &_group = lag1(&_group) then cdf + per;
- else cdf = per;
- run;
- %minmax(_in = _tmp_no_maverick, _var = &_var);
- %xaxis(_mean = &g_mean, _std = &g_std, _max = &g_max, _min = &g_min);
- %minmax(_in = _data_sum, _var = count);
- %y2axis(_mean = &g_mean, _std = &g_std, _max = &g_max, _min = &g_min);
- %nobs_nvars(_in=_tmp_bin_input);
- proc means data = _tmp_no_maverick noprint;
- var &_var;
- class &_group;
- output out=_tmp_inset (where = (_TYPE_ = 1))
- n = ss
- mean = mean
- std = std;
- options nolabel;
- run;
- proc sort data = _tmp_inset (drop = _TYPE_ _FREQ_);
- by &_group;
- run;
-
- data _tmp_inset;
- update _tmp_inset _tmp_bin_input (rename = (input = ss));
- by &_group;
- run;
- proc template;
- define style nbCDF;
- parent=Styles.Default;
- style Graph from Graph /
- OutputWidth = 8in
- OutputHeight = 5.6in;
- class color_list /
- 'bgA' = cxC0C0C0;
- class GraphColors /
- 'gwalls' = cxFFFFFF
- 'glegend' = cxFFFFFF
- 'ggrid' = cx909090
- %colorList;
- class GraphFonts /
- 'GraphDataFont' = ("<sans-serif>, <MTsans-serif>",14pt)
- 'GraphValueFont' = ("<sans-serif>, <MTsans-serif>",14pt)
- 'GraphLabelFont' = ("<sans-serif>, <MTsans-serif>",14pt)
- 'GraphFootnoteFont' = ("<sans-serif>, <MTsans-serif>",14pt)
- 'GraphTitleFont' = ("<sans-serif>, <MTsans-serif>",16pt,bold);
- end;
- run;
- options jpegquality = 95;
- ods graphics on /imagefmt= JPEG
- imagename="&_out";
- ods listing gpath="&_out_path"
- style=nbCDF;
- proc sgplot data = _data_sum;
- series x = &_var y = cdf / group = &_group lineattrs = (pattern = solid thickness = 3) name = "y1";
- series x = &_var y = count / y2axis group = &_group lineattrs = (pattern = longdash thickness = 2);
- xaxis label = '&_var' grid fitpolicy = rotatethin values = (&g_xmin to &g_xmax by &g_xbin);
- yaxis label = 'Cumulative Distribution(%)' grid values = (0 to 100 by 10);
- y2axis label = 'Distribution(N)' grid values = (&g_y2min to &g_y2max by &g_y2bin);
- title "&_var CDF Plot by &_group";
- inset "asdasdasda" "sdfsdfsd" / position = topleft;
- *keylegend "y1" / position= bottom;
- *footnote justify = right "XXX";
- run;
- ods listing close;
- ods graphics off;
- proc datasets library=work nolist;
- delete _tmp_no_maverick _stat _tmp_bin _tmp_bin_sum _tmp_bin_count _tmp_bin_input _tmp_inset _data_raw _data_sum;
- run;
- %mend CDF;
- %macro colorList;
- %do i =1 %to &g_obsnum;
- "gcdata&i" = %scan (&_color_y, &i)
- "gcdata%eval (&i + &g_obsnum)" = %scan (&_color_y2, &i)
- %end;
- %mend colorList;
- %macro nobs_nvars (_in = );
- %global g_obsnum g_varnum;
- %let dsid = %sysfunc (open (&_in, i));
- %let g_obsnum = %sysfunc (attrn (&dsid, nobs));
- %let g_varnum = %sysfunc (attrn (&dsid, nvars));
- %let rc = %sysfunc (close (&dsid));
- %mend nobs_nvars;
- %macro minmax(_in =, _var =);
- %global g_mean g_median g_min g_max g_std g_ss;
- proc means data = &_in noprint;
- var &_var;
- output out=_stat
- mean = g_mean
- median = g_median
- min = g_min
- max = g_max
- std = g_std
- n = g_ss;
- run;
- data _null_;
- set _stat;
- call symput('g_mean', g_mean);
- call symput('g_median', g_median);
- call symput('g_min', g_min);
- call symput('g_max', g_max);
- call symput('g_std', g_std);
- call symput('g_ss', g_ss);
- run;
- %mend minmax;
- %macro bin(_mean =, _std = _max =, _min =);
- %global g_bin;
- data _null_;
- mean = &_mean;
- if mean < 0 then mean = abs(mean);
- step = floor(log10(mean)) - 2;
- step = 10 ** step;
- min = &_mean - 3 * &_std;
- max = &_mean + 3 * &_std;
- bin = (max - min) / 50;
- bin = round (bin, step);
- call symput('g_bin', bin);
- run;
- %mend bin;
- %macro xaxis(_mean =, _std =, _max =, _min =);
- %global g_xmin g_xmax g_xbin;
- data _null_;
- mean = &_mean;
- if mean < 0 then mean = abs(mean);
- step = floor(log10(mean)) - 1;
- step = 10 ** step;
- min = &_mean - 3 * &_std;
- max = &_mean + 3 * &_std;
- bin = (max - min) / 10;
- min = round (min, step);
- max = round (max, step);
- bin = round (bin, step);
- call symput('g_xmin', min);
- call symput('g_xmax', max);
- call symput('g_xbin', bin);
- run;
- %mend xaxis;
- %macro y2axis(_mean =, _std =, _max =, _min =);
- %global g_y2min g_y2max g_y2bin;
- data _null_;
- max = &_max;
- if max < 0 then max = abs(max);
- step = floor(log10(max));
- step = 10 ** step;
- max = &_max * 1.1;
- min = 0;
- max = round (max, step);
- bin = (max - min) / 10;
- call symput('g_y2min', min);
- call symput('g_y2max', max);
- call symput('g_y2bin', bin);
- run;
- %mend y2axis;


雷达卡


京公网安备 11010802022788号







