#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.