SAS 에서 그래프를 그리는 프로시저는 여럿이지만 실제로 쓰는 것은 ODS Graphics 계열인 SGPLOT · SGPANEL · SGSCATTER 다. 문자 기반으로 출력하던 PROC PLOT 은 오래된 프로시저이므로 새로 쓰지 않는다.
| 프로시저 | 쓰임 |
|---|---|
SGPLOT |
그래프 하나를 그린다. 여러 계열을 한 판에 겹쳐 놓을 때 |
SGPANEL |
분류 변수마다 작은 판을 나눠 격자로 배치한다 |
SGSCATTER |
여러 변수 조합의 산점도를 행렬로 늘어놓는다 |
같은 데이터를 장비별로 보고 싶다고 할 때 두 가지 방법이 있고 결과가 전혀 다르다.
BY — 값마다 그래프를 따로 만든다. 장비가 20개면 그림이 20장 나온다. 미리 PROC SORT 로 정렬해 두어야 한다.GROUP= — 한 그래프 안에서 값마다 색과 마커를 달리한다. 비교가 목적이면 이쪽이다.proc sort data=prod_result;
by equipment_cd track_out_time;
run;
/* 장비마다 그림을 따로 뽑는다 */
proc sgplot data=prod_result;
by equipment_cd;
scatter x=track_out_time y=defect_percent / markerattrs=(symbol=circlefilled);
xaxis label="Track Out Time";
yaxis label="불량률(%)";
title "설비 #byval(equipment_cd) 불량률";
run;
/* 한 그림에 장비를 겹쳐 그린다 */
proc sgplot data=prod_result;
series x=track_out_time y=defect_percent / group=equipment_cd markers;
xaxis label="Track Out Time";
yaxis label="불량률(%)";
keylegend / title="설비";
run;
제목에 현재 BY 값을 넣을 때는 #byval(변수명) 을 쓴다. 변수 이름을 직접 적으면 글자 그대로 찍힌다.
GROUP= 의 범주가 많으면 기본 스타일의 색이 돌아가며 재사용되어 서로 구분되지 않는다. 손볼 자리는 두 군데다.
/* 1. 스타일을 색 구분이 뚜렷한 것으로 바꾼다 */
ods graphics on;
ods listing style=htmlblue;
/* 2. 마커 모양까지 같이 바꾼다 */
proc sgplot data=prod_result;
styleattrs datacontrastcolors=(blue red green purple orange)
datasymbols=(circlefilled trianglefilled squarefilled diamondfilled starfilled);
scatter x=track_out_time y=defect_percent / group=equipment_cd;
run;
범주가 열 개를 넘어가면 색만으로는 구분이 어렵다. 이때는 SGPANEL 로 판을 나누는 편이 읽기 쉽다.
proc sgpanel data=prod_result;
panelby process_cd / columns=3 novarname;
scatter x=track_out_time y=defect_percent / group=equipment_cd;
colaxis label="Track Out Time";
rowaxis label="불량률(%)";
run;
가로축 값이 길면 SAS 가 알아서 기울여 찍는데, 세로로 세우고 싶으면 축 옵션에서 지정한다.
proc sgplot data=prod_result;
vbar equipment_cd / response=defect_percent stat=mean;
xaxis discreteorder=data fitpolicy=rotate valuesrotate=vertical;
run;
FITPOLICY= 는 값이 넘칠 때 어떻게 처리할지를 정한다 — ROTATE 는 기울이고, STAGGER 는 두 줄로 엇갈려 찍고, THIN 은 일부를 생략한다. VALUESROTATE=VERTICAL 은 SAS 9.4 의 유지보수 릴리스에 따라 지원 여부가 다르므로, 구문 오류가 나면 FITPOLICY=ROTATE 로 대신한다 (확인 필요).
누적 그래프는 프로시저가 만들어 주지 않는다. DATA 단계에서 누적 컬럼을 먼저 만든다.
proc sort data=prod_result;
by equipment_cd track_out_time;
run;
data cumulative;
set prod_result;
by equipment_cd;
if first.equipment_cd then cum_defect = 0;
cum_defect + defect_percent;
run;
proc sgplot data=cumulative;
series x=track_out_time y=cum_defect / group=equipment_cd;
yaxis label="누적 불량률(%)";
run;
cum_defect + defect_percent; 는 합산문이다. 이 형태는 변수를 자동으로 RETAIN 하고 결측을 0 으로 다루므로 별도의 retain 문이 필요 없다.
22-322: 구문 오류, 다음에 나열된 항목이 예상됨: 뒤에 나오는 목록이 그 자리에 올 수 있는 옵션의 전부다. 쓰려던 옵션이 목록에 없으면 그 옵션은 그 문장에 속하지 않는다. scatter 문에 쓰는 옵션을 xaxis 에 적거나, 축 옵션을 markerattrs 안에 적었을 때 자주 나온다. 목록이 COLOR, FAMILY, SIZE, STYLE, WEIGHT 라면 글꼴 속성을 받는 자리이므로 valueattrs=(size=8pt) 형태로 적어야 한다.