SAS sgplot 阶梯颜色渐变
SAS sgplot step color gradient
我想生成一个 "step" 图 (CDF),我正在尝试使用 dattrmap 选项更改线条颜色。但是颜色没有变化。下面是我的代码:
%MACRO ATRRMAP(fich=,var=);
proc freq data=&fich noprint;
tables &var/nocum nopercent norow nocol out=freq&var;
format _all_;
where &var^=.;
run;
data test;
set freq&var end=eof;
call symputx("mvCAT"||strip(_N_),&var);
if eof then call symputx("NB",_N_);
run;
data myattrmap;
length id value 3 linecolor pattern 3 fillcolor ;
%do i=1 %to &NB;
id='myid';
value = &&mvCAT&i;
linecolor=cats("grey",put(&i*5,hex2.));
%if &i=1 or &i=5 or &i=9 %then %do;
pattern = 1;
%end;%else %if &i=2 or &i=6 or &i=10 %then %do;
pattern = 15;
%end;%else %if &i=3 or &i=7 or &i=11 %then %do;
pattern = 2;
%end;%else %if &i=4 or &i=8 or &i=12 %then %do;
pattern = 8;
%end;%else %do;
pattern = 41;
%end;
fillcolor=cats("grey",put(&i*5,hex2.));
output;
%end;
run;
%MEND ATRRMAP;
生成的数据如下所示:
id value pattern fillcolor
myid -6 1 CXbdc3c7
myid -5 2 CXbdc3c7
myid -4 8 CXbdc3c7
然后,我使用了sgplot:
PROC SGPLOT DATA=cumul sganno=annotation NOBORDER dattrmap=myattrmap;
STEP X=variable Y=percent/GROUP=newgroup attrid=myid;
YAXIS LABEL="Cumulative percentage of patients" VALUES=(0 TO 100 BY
10);
XAXIS LABEL=" " VALUES=(-4 to 4 by 0.5) ;
KEYLEGEND /TITLE=" " LOCATION=INSIDE POSITION=BOTTOMRIGHT ACROSS=1
DOWN=3 NOBORDER;
RUN;
与 sgplot 一起使用的数据 myfile 如下所示:
variable percent newgroup
-3.66 2.70 -6
-3.41 5.40 -6
-3.26 8.11 -6
-3.28 5.8 -5
-2.97 13.51 -5
我想要一个灰色渐变。但首先,我只想使用 dattrmap 在我的绘图上选择彩色线条。我尝试使用 fillcolor 和 linecolor 但它没有用。我尝试使用 styleattrs 的 datacontrastcolors 选项直接在 SGPLOT 语句中更改颜色并且它有效。有人看到我错过了什么吗?
必须是 GROUP = 变量,它是控制颜色、形状和图案的变量。您按 NEWGROUP 而不是值对变量进行分组。如果您需要的话,您可以创建一个代理来执行此操作。如果没有您需要的更多详细信息,我不确定我们如何帮助您找到解决方法,但这确实解释了为什么它目前不起作用。
来自文档:
The values of the VALUE variable are valid data group values. These values are case sensitive. The data group is assigned in the plot statement with the GROUP= option.
假设您确实希望根据 NEWGROUP 的线条颜色不同这里是您可以修改代码的方法。 请注意,我已经大大简化了您的代码,并且您指定颜色的方式存在问题 - 我暂时忽略了这些问题,并将其留给您解决。这些值当前在宏中进行了硬编码。 我还建议更改 if _n_
部分以使用 MOD()
函数,因为您的数据中似乎有某种模式。它可能行不通,但值得考虑。
*create fake data;
data myfile;
input variable percent newgroup $;
cards;
-3.66 2.70 group1
-3.41 5.40 group1
-3.26 8.11 group1
-3.28 5.8 group2
-2.97 13.51 group2
;;;;
run;
*macro to create attribute map;
%MACRO ATRRMAP(fich=,var=);
proc freq data=&fich noprint;
tables &var/nocum nopercent norow nocol out=freq&var (drop=percent);
format _all_;
where not missing(&var);
run;
data myattrmap;
length id value linecolor pattern 3 fillcolor ;
set freq&var.;
id='myid';
value = &var.;
if _n_ =1 then
linecolor = 'CXbdbdbd';
else if _n_=2 then
linecolor = 'CX636363';
*linecolor=cats("grey",put(_n_*5,hex2.));
if _n_ in (1, 5, 9) then
pattern = 1;
else if _n_ in (2, 6, 10) then
pattern = 15;
else if _n_ in (3, 7, 11) then
pattern = 2;
else if _n_ in ( 4, 8, 12) then
pattern=8;
else pattern = 14;
fillcolor=cats("grey",put(_n_*5,hex2.));
output;
run;
%MEND ATRRMAP;
*create attribute map for newgroup;
%ATRRMAP(fich=myfile, var=newgroup);
*plot graph;
PROC SGPLOT DATA=myfile NOBORDER dattrmap=myattrmap;
STEP X=variable Y=percent/GROUP=newgroup attrid=myid;
YAXIS LABEL="Cumulative percentage of patients" VALUES=(0 TO 100 BY
10);
XAXIS LABEL=" " VALUES=(-4 to 4 by 0.5);
KEYLEGEND /TITLE=" " LOCATION=INSIDE POSITION=BOTTOMRIGHT ACROSS=1
DOWN=3 NOBORDER;
RUN;
找到配色方案名称的方法和规则here。
我想生成一个 "step" 图 (CDF),我正在尝试使用 dattrmap 选项更改线条颜色。但是颜色没有变化。下面是我的代码:
%MACRO ATRRMAP(fich=,var=);
proc freq data=&fich noprint;
tables &var/nocum nopercent norow nocol out=freq&var;
format _all_;
where &var^=.;
run;
data test;
set freq&var end=eof;
call symputx("mvCAT"||strip(_N_),&var);
if eof then call symputx("NB",_N_);
run;
data myattrmap;
length id value 3 linecolor pattern 3 fillcolor ;
%do i=1 %to &NB;
id='myid';
value = &&mvCAT&i;
linecolor=cats("grey",put(&i*5,hex2.));
%if &i=1 or &i=5 or &i=9 %then %do;
pattern = 1;
%end;%else %if &i=2 or &i=6 or &i=10 %then %do;
pattern = 15;
%end;%else %if &i=3 or &i=7 or &i=11 %then %do;
pattern = 2;
%end;%else %if &i=4 or &i=8 or &i=12 %then %do;
pattern = 8;
%end;%else %do;
pattern = 41;
%end;
fillcolor=cats("grey",put(&i*5,hex2.));
output;
%end;
run;
%MEND ATRRMAP;
生成的数据如下所示:
id value pattern fillcolor
myid -6 1 CXbdc3c7
myid -5 2 CXbdc3c7
myid -4 8 CXbdc3c7
然后,我使用了sgplot:
PROC SGPLOT DATA=cumul sganno=annotation NOBORDER dattrmap=myattrmap;
STEP X=variable Y=percent/GROUP=newgroup attrid=myid;
YAXIS LABEL="Cumulative percentage of patients" VALUES=(0 TO 100 BY
10);
XAXIS LABEL=" " VALUES=(-4 to 4 by 0.5) ;
KEYLEGEND /TITLE=" " LOCATION=INSIDE POSITION=BOTTOMRIGHT ACROSS=1
DOWN=3 NOBORDER;
RUN;
与 sgplot 一起使用的数据 myfile 如下所示:
variable percent newgroup
-3.66 2.70 -6
-3.41 5.40 -6
-3.26 8.11 -6
-3.28 5.8 -5
-2.97 13.51 -5
我想要一个灰色渐变。但首先,我只想使用 dattrmap 在我的绘图上选择彩色线条。我尝试使用 fillcolor 和 linecolor 但它没有用。我尝试使用 styleattrs 的 datacontrastcolors 选项直接在 SGPLOT 语句中更改颜色并且它有效。有人看到我错过了什么吗?
必须是 GROUP = 变量,它是控制颜色、形状和图案的变量。您按 NEWGROUP 而不是值对变量进行分组。如果您需要的话,您可以创建一个代理来执行此操作。如果没有您需要的更多详细信息,我不确定我们如何帮助您找到解决方法,但这确实解释了为什么它目前不起作用。
来自文档:
The values of the VALUE variable are valid data group values. These values are case sensitive. The data group is assigned in the plot statement with the GROUP= option.
假设您确实希望根据 NEWGROUP 的线条颜色不同这里是您可以修改代码的方法。 请注意,我已经大大简化了您的代码,并且您指定颜色的方式存在问题 - 我暂时忽略了这些问题,并将其留给您解决。这些值当前在宏中进行了硬编码。 我还建议更改 if _n_
部分以使用 MOD()
函数,因为您的数据中似乎有某种模式。它可能行不通,但值得考虑。
*create fake data;
data myfile;
input variable percent newgroup $;
cards;
-3.66 2.70 group1
-3.41 5.40 group1
-3.26 8.11 group1
-3.28 5.8 group2
-2.97 13.51 group2
;;;;
run;
*macro to create attribute map;
%MACRO ATRRMAP(fich=,var=);
proc freq data=&fich noprint;
tables &var/nocum nopercent norow nocol out=freq&var (drop=percent);
format _all_;
where not missing(&var);
run;
data myattrmap;
length id value linecolor pattern 3 fillcolor ;
set freq&var.;
id='myid';
value = &var.;
if _n_ =1 then
linecolor = 'CXbdbdbd';
else if _n_=2 then
linecolor = 'CX636363';
*linecolor=cats("grey",put(_n_*5,hex2.));
if _n_ in (1, 5, 9) then
pattern = 1;
else if _n_ in (2, 6, 10) then
pattern = 15;
else if _n_ in (3, 7, 11) then
pattern = 2;
else if _n_ in ( 4, 8, 12) then
pattern=8;
else pattern = 14;
fillcolor=cats("grey",put(_n_*5,hex2.));
output;
run;
%MEND ATRRMAP;
*create attribute map for newgroup;
%ATRRMAP(fich=myfile, var=newgroup);
*plot graph;
PROC SGPLOT DATA=myfile NOBORDER dattrmap=myattrmap;
STEP X=variable Y=percent/GROUP=newgroup attrid=myid;
YAXIS LABEL="Cumulative percentage of patients" VALUES=(0 TO 100 BY
10);
XAXIS LABEL=" " VALUES=(-4 to 4 by 0.5);
KEYLEGEND /TITLE=" " LOCATION=INSIDE POSITION=BOTTOMRIGHT ACROSS=1
DOWN=3 NOBORDER;
RUN;
找到配色方案名称的方法和规则here。