SAS — можно отображать текст с помощью аннотации в той же позиции, что и на графике, независимо от размера легенды и размера графика?

#graph #sas #annotate #sgplot

#График #sas #аннотировать #sgplot

Вопрос:

В SAS я пытаюсь установить «фиксированное» положение стрелки для отображения на графике. Я бы хотел, чтобы стрелка всегда отображалась в одной и той же позиции, в зависимости от размера графика. На данный момент я использую аннотацию для отображения стрелки, ее координат x1 и y1, выраженных в процентах от площади графика (DRAWSPACE=’GRAPHPERCENT’). Ниже приведен мой код для создания графика и набора данных аннотирования:

 DATA anno_test;
    length function $10 label $20;
    retain y1 15 drawspace 'GRAPHPERCENT';
    function='ARROW';x1=15;x2=10;y2=15;linethickness=1;shape="FILLED";OUTPUT;
    function='ARROW';x1=93;x2=98;y2=15;linethickness=1;shape="FILLED";OUTPUT;
RUN;

ODS GRAPHICS ON BORDER=OFF;
PROC SGPLOT DATA=_cumul sganno=anno_test NOBORDER;
    STYLEATTRS DATALINEPATTERNS=(1 15 2 8 4 41);
    STEP X=score Y=cum_pct/GROUP=newgroup lineattrs=(thickness=1.5);
    YAXIS LABEL="Cumulative percentage of subjects" VALUES=(0 TO 100 BY 10) VALUEATTRS=(Size=9pt) LABELATTRS=(Size=10pt Weight=bold);
    XAXIS LABEL="Score" VALUES=(-60 TO 60 BY 20) VALUEATTRS=(Size=9pt) LABELATTRS=(Size=10pt Weight=bold);
    KEYLEGEND / TITLE=" " NOBORDER VALUEATTRS=(Size=7);
    REFLINE 0 / AXIS=X LINEATTRS=(Pattern=34 Thickness=0.6);
    REFLINE 50 / AXIS=Y LINEATTRS=(Pattern=34 Thickness=0.6);
RUN;
ODS GRAPHICS OFF;
 

Проблема, с которой я сталкиваюсь, заключается в том, что в зависимости от размера легенды и размера графика стрелка может перекрывать ось x. Я не знаком с аннотацией, но я пробовал разные варианты и drawspace, но я не могу отобразить его идеально, независимо от размера легенды.

У кого-нибудь есть идея? Или я должен заблокировать размер графика, чтобы избежать этой «проблемы»? Спасибо!

Комментарии:

1. Стрелка находится внутри вашего графического пространства или снаружи? Я бы предположил, что если вы переместите его из аннотации в оператор SCATTER или TEXT, вы получите согласованные результаты. Вы также можете заглянуть в MARKERCHAR, SYMBOLCHAR, чтобы добавить их в SGPLOT.

2. Спасибо, Риаз! Я попробую использовать ТЕКСТОВЫЙ статус. Стрелки находятся за пределами области графика, чуть ниже оси x.

Ответ №1:

Попробуйте использовать DATAPERCENT

 data have;
  call streaminit(2020);
  do score = -50 to 50 by 5;
    z = 100;
    do newgroup = 'A', 'B', 'C';
      cum_pct = rand('integer',floor(z/2),z);
      output;
      z = z - cum_pct;
    end;
    newgroup = 'D';
    cum_pct = z;
    output;
  end;
run;

DATA anno_test;
    length function $10 label $20;
    retain y1 15 DRAWSPACE 'DATAPERCENT';
    function='ARROW';x1=10;x2=  0;y2=15;linethickness=1;shape="FILLED";OUTPUT;
    function='ARROW';x1=90;x2=100;y2=15;linethickness=1;shape="FILLED";OUTPUT;
RUN;
 

Стрелки, указывающие на край области данных

введите описание изображения здесь

Те же стрелки, когда область данных шире оси X

введите описание изображения здесь

Те же стрелки, когда значения аннотации y y1 = -10; y2 = -10;

введите описание изображения здесь

Комментарии:

1. Спасибо, Ричард! Это решение хорошо работает для отображения стрелок внутри, в области данных. Но я изо всех сил пытался сделать то же самое за пределами области данных, например, чуть ниже оси x. В зависимости от размера легенды область ниже не будет иметь одинаковый размер. Я попробовал LAYOUTPERCENT, он работает, но не лучшее решение, поскольку стрелки все еще движутся (дайте мне знать, если я недостаточно понятен).

2. Знаете ли вы, что координаты SGPLOT datapercent допускают отрицательное значение Y? Попробуйте y1=-10; y2=-10; . На что должны указывать стрелки? Допускаете ли вы, что размер и расположение легенды также могут быть указаны (т. Е. Не полагаться на автоматическую компоновку)

3. Спасибо за ваш ответ, Ричард, вы даете мне решение: также указать расположение легенды, это очень хорошая идея и должна решить мою проблему! И я использовал отрицательные координаты для Y, чтобы разместить стрелки ниже оси X.