이전 게시글에서는 그래프 템플릿을 생성하는 다양한 방법에 대해 설명하였다. 그러나 생성된 템플릿의 대부분은 특정 애플리케이션에서만 사용할 수 있습니다. 이번 게시글에서는 그래프 템플릿의 구조와 구문에 대해 자세히 설명하므로 생성된 템플릿을 업데이트하여 보다 일반적으로 적용할 수 있습니다.
기본 그래프 템플릿 언어(GTL)는 LAYOW 문과 Plot 문을 포함하여 중첩된 구조로 구성됩니다. 템플릿의 중첩 구조는 아래의 그림에 설명되어 있습니다.
● LAYOUT GRIDDED & LAYOUT DATAPANEL : 동일한 치수와 속성을 가진 그래프 셀 그리드를 만들 수 있습니다.
● LAYOUT LATTICE and LAYOUT DATALATTICE : 다른 치수와 특성을 가진 그래프 셀 그리드를 만들 수 있습니다.
● LAYOUT OVERLAY : 하나 이상의 중첩된 그림이 있는 단일 그래프 셀을 만들 수 있습니다.
◆ Dynamic
SAS 매크로 프로그래밍에 익숙한 경우 템플릿의 DYNAMIC 문이 매크로에 제공되는 괄호 안의 매개변수 목록과 유사한 기능을 제공한다는 것을 알 수 있습니다.
DYNAMIC _var1 _var2 _var3;
DYNAMIC _var1 = "age" _var2 = "height" _var3 = "sex";
매크로 파라미터와 DYNAMIC 변수의 유일한 주요 차이점은 DYNAMIC 변수의 기본값을 설정할 수 없다는 것입니다.
◆ Titles and Footnotes
제목 및 각주 매개변수는 유연한 템플릿에 필요합니다. 생성된 템플릿에는 단일 ENTITLE 문이 포함됩니다
ENTRYTITLE 'This is a title';
ENTRYFOOTNOTE 'This is a footnote';
모든 경우에 충분하지 않을 수 있지만 다행히 모든 ENTTITLE과 그에 상응하는 항목이 있습니다. 연관된 텍스트가 없는 ENTERFOOTNOTE 문은 무시되므로 템플릿에 두 개의 문의 적절한 최대 수가 포함될 수 있습니다.
ENTRYTITLE 'Title A';
ENTRYTITLE;
ENTRYTITLE 'Title C';
빈 문자열을 사용하여 빈 제목을 삽입할 수 있습니다.
ENTRYTITLE 'Title A';
ENTRYTITLE ' ';
ENTRYTITLE 'Title C';
이러한 문의 텍스트 기본 형식은 현재 ODS 스타일로 제어됩니다.
기존 SAS/GRAF와는 달리 데이터를 기반으로 한 기본 설정이 상당히 좋기 때문에 일반적으로 ODS 그래픽으로 플로팅할 때 축을 지정할 필요가 없습니다.
그러나 그래픽에 공통 축이 있는 그래프 패널이 두 개 이상 포함된 경우 축 중 하나를 제거하고 축 크기를 유지해야 할 수 있습니다.
LAYOUT 문에는 외부 모서리에 공통 축만 표시하는 옵션이 있습니다.
LAYOUT LATTICE / ROWDATARANGE = UNION;
/* common row axes */
LAYOUT LATTICE / COLUMNDATARANGE = UNION;
/* common column axes */
LAYOUT LATTICE / ROW2DATARANGE = UNION;
/* common secondary row axes */
LAYOUT LATTICE / COLUMN2DATARANGE = UNION;
/* common secondary column axes */
COLUMAXES와 ROWAXES는 기존 레이아웃에서 각각 기둥과 행 축을 교체하는 동일한 기능을 가지고 있습니다.
ColumnAXIS 또는 ROWAX를 고정하기 위한 추가 레이아웃 문처럼 작동합니다
패널의 열이 여러 개 있는 경우 각 열에 대해 별도의 COLUMAX 문을 지정할 수 있습니다.
아래의 코드는 모든 축 눈금, 눈금 값 및 레이블이 표시된 단일 패널 열 아래에 X축을 표시합니다.
COLUMNAXES;
COLUMNAXIS / DISPLAY = (LABEL LINE TICKS TICKVALUES);
ENDCOLUMNAXES;
ALIGN= 옵션을 사용하여 그래프 영역 주위에 사이드바 영역을 지정할 수 있습니다.
가능한 값: 상단, 왼쪽, 오른쪽 및 하단.
이러한 영역은 축 영역 외부에 있습니다. 기본적으로 내용은 영역의 전체 너비를 채우도록 확장되므로 SPACEFILL=FALSE를 사용하는 것이 좋습니다.
이러한 영역의 일반적인 용도는 LAYOUT Overlay 영역에서 모든 패널 아래로 이산LEGEND 문을 이동하는 것입니다.
SIDEBAR / ALIGN = BOTTOM SPACEFILL = FALSE;
DISCRETELEGEND "scatter" / TITLE = _grouplabel ORDER = ROWMAJOR
BORDER = TRUE BORDERATTRS = (COLOR = BLACK);
ENDSIDEBAR;
PROC SGSCATER 그래프는 기본 형태로 제한될 수 있으므로 간단한 그래프를 가져와 개선하여 보다 관련성이 높은 그래프를 만들 수 있습니다.
다음 절에서는 기본 PROC SGSCATER 그래프에 새 셀을 추가하는 방법을 설명합니다.
PROC SGSCATER는 개별 플롯이 유사하지만 동일하지는 않은 다중 채널 그래프를 개발하는 데 이상적인 출발점이다. 플롯 문을 사용하여 동일한 데이터 집합에 있는 일련의 변수 조합을 별도의 패널에 산점도로 표시할 수 있습니다. 다음 예제는 기본 코드를 보여줍니다.
PROC SGSCATTER DATA = sashelp.class
TMPLOUT = 'sgscatter.sas';
TITLE 'Class details';
PLOT (height weight) * age height * weight / GROUP = sex;
RUN;
이 코드는 높이*age, 무게*age 및 높이*weight*weight의 세 가지 산점도를 생성합니다.
기본적으로, PROC SGSCATTER는 2 × 2 그리드에 플롯을 배열하므로, 세 개의 플롯이 네 개의 셀 중 세 개에 나타나야 합니다. GROUP= 옵션은 PROC GPLOT의 y*x=그룹 구문과 동일하지만 모든 플롯에 적용됩니다.
sgscatter.sas에 저장된 생성된 템플릿 코드는 다음과 같습니다.
proc template;
define statgraph sgscatter;
begingraph / designwidth=640 designheight=640;
EntryTitle "Class details" /;
layout gridded;
layout lattice / pad=(top=5) rowgutter=10
columngutter=10 columns=2;
ScatterPlot X=Age Y=Height /
primary=true Group=Sex NAME="PLOT";
ScatterPlot X=Age Y=Weight / primary=true Group=Sex;
ScatterPlot X=Weight Y=Height /
primary=true Group=Sex;
endlayout;
DiscreteLegend "PLOT" / order=rowmajor title="Sex";
endlayout;
endgraph;
end;
run;
다른 SAS 코드와 일치하도록 다시 포맷한 후 생성된 템플릿은 다음과 같습니다.
매개 변수로 변환할 하드 코딩된 항목은 굵게 표시되고 템플릿 이름은 밑줄이 표시됩니다.
PROC TEMPLATE;
DEFINE STATGRAPH sgscatter;
BEGINGRAPH / DESIGNWIDTH = 640 DESIGNHEIGHT = 640;
ENTRYTITLE "Class details" /;
LAYOUT GRIDDED;
LAYOUT LATTICE /
PAD = (TOP = 5) ROWGUTTER = 10
COLUMNGUTTER = 10 COLUMNS=2;
SCATTERPLOT X = Age Y = Height /
PRIMARY = TRUE GROUP = Sex NAME = "plot";
SCATTERPLOT X = Age Y = Weight /
PRIMARY = TRUE GROUP = Sex;
SCATTERPLOT X = Weight Y = Height /
PRIMARY = TRUE GROUP = Sex;
ENDLAYOUT;
DISCRETELEGEND "plot" / ORDER = ROWMAJOR TITLE = "Sex";
ENDLAYOUT;
ENDGRAPH;
END;
RUN;
템플릿에 매개변수를 추가하는 목적은 개발 중에 사용되는 데이터 집합이 아닌 다른 데이터 집합과 함께 사용할 수 있도록 하는 것이다.
데이터 세트 변수 Age, Height, Weight 및 Sex는 _var1, _var2, _var3 및 _group으로 바꿀 수 있습니다. 범례 제목 Sex(섹스)는 매개 변수 groouplabel로 변환할 수도 있습니다.
이러한 모든 새 매개 변수가 DYNAMIC 문에 지정되었습니다.
PROC TEMPLATE;
DEFINE STATGRAPH sgscatter;
DYNAMIC _var1 _var2 _var3 _group _grouplabel;
BEGINGRAPH / DESIGNWIDTH = 640 DESIGNHEIGHT = 640;
ENTRYTITLE "Class details" /;
LAYOUT GRIDDED;
LAYOUT LATTICE /
PAD = (TOP = 5) ROWGUTTER = 10
COLUMNGUTTER = 10 COLUMNS = 2;
SCATTERPLOT X = _var1 Y = _var2 /
PRIMARY = TRUE GROUP = _group
NAME = "plot";
SCATTERPLOT X = _var1 Y = _var3 /
PRIMARY = TRUE GROUP = _group;
SCATTERPLOT X = _var3 Y = _var2 /
PRIMARY = TRUE GROUP = _group;
ENDLAYOUT;
DISCRETELEGEND "plot" / ORDER = ROWMAJOR
TITLE = _grouplabel;
ENDLAYOUT;
ENDGRAPH;
END;
RUN;
제목 및 각주 매개변수는 유연한 템플릿에 필요합니다. 업데이트된 템플릿에는 다음이 포함됩니다.
3개의 ENTITLE 및 3개의 ENTERFOUTNote 문과 각 문마다 매개 변수가 있습니다.
이 템플릿은 유연성을 높이기 위해 업데이트 중이므로 하드 코딩된 값을 제거하는 것이 좋습니다.
즉, DESIGHEAT= 및 DESIGHEAT=를 BENGRAF 문에서 제거해야 합니다.
이 템플릿에는 현재 네 개의 패널과 네 개의 변수가 있지만 세 개의 그림만 있습니다. 범례에는 그룹 변수의 값 리스트만 포함되므로 그룹 빈도에 대한 막대 차트를 포함하는 것이 좋습니다.
PROC TEMPLATE;
DEFINE STATGRAPH scatter_2x2_bar;
DYNAMIC _var1 _var2 _var3 _group _grouplabel
_title1 _title2 _title3
_footnote1 _footnote2 _footnote3;
BEGINGRAPH /;
ENTRYTITLE _title1 /;
ENTRYTITLE _title2 /;
ENTRYTITLE _title3 /;
LAYOUT GRIDDED;
LAYOUT LATTICE /
PAD = (TOP = 5) ROWGUTTER = 10
COLUMNGUTTER = 10 COLUMNS = 2;
SCATTERPLOT X = _var1 Y = _var2 /
PRIMARY = TRUE GROUP = _group NAME = "plot";
SCATTERPLOT X = _var1 Y = _var3 /
PRIMARY = TRUE GROUP = _group;
SCATTERPLOT X = _var3 Y = _var2 /
PRIMARY = TRUE GROUP = _group;
BARCHART X = _group /
PRIMARY = TRUE STAT = FREQ ORIENT = HORIZONTAL;
ENDLAYOUT;
DISCRETELEGEND "plot" / ORDER = ROWMAJOR TITLE = _grouplabel;
ENDLAYOUT;
ENTRYFOOTNOTE _footnote1 /;
ENTRYFOOTNOTE _footnote2 /;
ENTRYFOOTNOTE _footnote3 /;
ENDGRAPH;
END;
RUN;
PROC SGRENDER DATA = sashelp.cars
TEMPLATE = 'scatter_2x2_bar';
DYNAMIC _var1 = 'EngineSize' _var2 = 'Horsepower' _var3 = 'MPG_City'
_group = 'Type' _grouplabel = 'Type'
_title1 = 'Car comparison';
RUN;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.