【问题标题】:SAS sgplot step color gradientSAS sgplot 步进颜色渐变
【发布时间】:2018-11-19 16:20:14
【问题描述】:

我想生成一个“阶梯”图 (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 $20 value 3 linecolor $10 pattern 3 fillcolor $20;
    %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 在我的绘图上选择颜色线。我尝试使用填充颜色和线条颜色,但它不起作用。我尝试使用 styleattrs 的 datacontrastcolors 选项直接在 SGPLOT 语句中更改颜色,它可以工作。有人看到我错过了什么吗?

【问题讨论】:

  • 宏调用在哪里,带参数?
  • @Reeza 这是 attrmap 宏调用:'%ATRRMAP(fich=myfile,var=myvar);'
  • 将这些数据和一些示例数据添加到您的帖子中,我们可以对其进行测试,看看哪里出了问题。数据属性映射确实有效。有时您需要在 ODS GRAPHICS 语句上设置 attrpriority=none 选项,以强制它覆盖默认值。
  • 谢谢@Reeza,我用一些数据线更新了我的帖子。另外,我尝试了 attrpriority 选项,但它不起作用:/
  • 由于某种原因,您的代码将值转换为字符值。你也有这种情况吗?这可能是你的问题。

标签: colors sas cdf step sgplot


【解决方案1】:

必须是 GROUP = 变量,即控制颜色、形状和图案的变量。您按 NEWGROUP 而不是值对变量进行分组。不过,如果这是您想要的,您可以创建一个代理来执行此操作。如果没有您需要的更多详细信息,我不确定我们如何帮助您找到解决方法,但这确实解释了为什么它目前不起作用。

来自文档:

VALUE 变量的值是有效的数据组值。这些值区分大小写。数据组在绘图语句中使用 GROUP= 选项分配。

假设您确实希望基于 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 $20 value $20 linecolor $10 pattern 3 fillcolor $20;
        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

【讨论】:

  • 感谢@Reeza 为我的问题提供一些思考。你是对的,我想要基于 NEWGROUP 的线条颜色不同。我的数据 MYFILE 和 MYATTRMAP 中有相同的值,但它仍然不起作用。我会尝试另一种方式,谢谢!
  • 上面的代码有效吗?它在我的机器上工作。使用的颜色代码是问题的一部分,我假设您也像我一样切换到使用十六进制代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 2011-04-26
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多