BookmarkSubscribeRSS Feed

[SAS 고수의 팁] Graph Templates 커스터마이징하기

Started ‎02-27-2022 by
Modified ‎02-27-2022 by
Views 1,235

 

 

이전 게시글에서는 그래프 템플릿을 생성하는 다양한 방법에 대해 설명하였다. 그러나 생성된 템플릿의 대부분은 특정 애플리케이션에서만 사용할 수 있습니다. 이번 게시글에서는 그래프 템플릿의 구조와 구문에 대해 자세히 설명하므로 생성된 템플릿을 업데이트하여 보다 일반적으로 적용할 수 있습니다.

 

Structure

기본 그래프 템플릿 언어(GTL)는 LAYOW 문과 Plot 문을 포함하여 중첩된 구조로 구성됩니다. 템플릿의 중첩 구조는 아래의 그림에 설명되어 있습니다.

 

 image.png

 

 

 

● LAYOUT GRIDDED & LAYOUT DATAPANEL : 동일한 치수와 속성을 가진 그래프 셀 그리드를 만들 수 있습니다.

● LAYOUT LATTICE and LAYOUT DATALATTICE : 다른 치수와 특성을 가진 그래프 셀 그리드를 만들 수 있습니다.

● LAYOUT OVERLAY : 하나 이상의 중첩된 그림이 있는 단일 그래프 셀을 만들 수 있습니다.

 

 

Template Syntax

◆ 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 스타일로 제어됩니다.

 

 

 

 

Axes and Legends

기존 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 */

 

 

 

Columnaxes and Rowaxes

COLUMAXES와 ROWAXES는 기존 레이아웃에서 각각 기둥과 행 축을 교체하는 동일한 기능을 가지고 있습니다.

ColumnAXIS 또는 ROWAX를 고정하기 위한 추가 레이아웃 문처럼 작동합니다

패널의 열이 여러 개 있는 경우 각 열에 대해 별도의 COLUMAX 문을 지정할 수 있습니다.

아래의 코드는 모든 축 눈금, 눈금 값 및 레이블이 표시된 단일 패널 열 아래에 X축을 표시합니다.

 

 

COLUMNAXES;
COLUMNAXIS / DISPLAY = (LABEL LINE TICKS TICKVALUES);
ENDCOLUMNAXES;

 

 

 

 

SIDEBAR

ALIGN= 옵션을 사용하여 그래프 영역 주위에 사이드바 영역을 지정할 수 있습니다.

가능한 값: 상단, 왼쪽, 오른쪽 및 하단.

이러한 영역은 축 영역 외부에 있습니다. 기본적으로 내용은 영역의 전체 너비를 채우도록 확장되므로 SPACEFILL=FALSE를 사용하는 것이 좋습니다.

이러한 영역의 일반적인 용도는 LAYOUT Overlay 영역에서 모든 패널 아래로 이산LEGEND 문을 이동하는 것입니다.

 

SIDEBAR / ALIGN = BOTTOM SPACEFILL = FALSE;
DISCRETELEGEND "scatter" / TITLE = _grouplabel ORDER = ROWMAJOR
BORDER = TRUE BORDERATTRS = (COLOR = BLACK);
ENDSIDEBAR;

 

                                                                                                                                     

 

 

PROC SGSCATTER Graphs 템플릿 만들기

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;

 

image (1).png

 

 

 

 

템플릿에 DYNAMIC Parameters 설정

다른 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 문에서 제거해야 합니다.

 

 

 

 

 

Adding a New Graph: 그래프 추가하기

이 템플릿에는 현재 네 개의 패널과 네 개의 변수가 있지만 세 개의 그림만 있습니다. 범례에는 그룹 변수의 값 리스트만 포함되므로 그룹 빈도에 대한 막대 차트를 포함하는 것이 좋습니다.

 

 

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;

 

image (2).png

 

 

Version history
Last update:
‎02-27-2022 06:40 AM
Updated by:
Contributors

hackathon24-white-horiz.png

The 2025 SAS Hackathon Kicks Off on June 11!

Watch the live Hackathon Kickoff to get all the essential information about the SAS Hackathon—including how to join, how to participate, and expert tips for success.

YouTube LinkedIn

Article Labels
Article Tags