SAS sgplot шаг градиента цвета - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу сгенерировать "пошаговый" график (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;

Myfile данныхиспользуется с sgplot выглядит следующим образом:

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, но это не сработало.Я пытаюсь изменить цвет непосредственно в операторе SGPLOT с опцией datacontrastcolors styleattrs, и это работает.Кто-то видит, что мне не хватает?

1 Ответ

0 голосов
/ 20 ноября 2018

Это должна быть переменная 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;

Методы и правила для имен цветовых схем находятся здесь .

...