Proc SGplot으로 '멋진' 지도를 만드는 법


예술가들은 몇 가지 도구만으로도 멋진 그림을 그릴 수 있습니다. 물론, 물감, 색연필, 목탄 등 선호하는 도구는 저마다 다를 수 있겠지만 말이죠.


SAS에서 멋진 그래프를 만드는 방법도 크게 다르지 않은데요, 오늘은 그 방법을 예를 들어 설명해보고자 합니다.


SAS에서는 SAS/Graph Proc GMap을 사용하여 멋진 지도를 만들 수가 있습니다. GMap은 SAS가 지도 제작용으로 특별 개발한 소프트웨어로, 여러 세그먼트로 나뉘어 있는 폴리곤(polygon) 등을 적절하고 쉽게 처리할 수 있도록 지원하기 때문에 사용자가 응답 데이터(지도에 색상을 입히기 위해 사용되는 값)에 대한 별도의 데이터 집합과 데이터를 플로팅할 지리적 지도를 손쉽게 지정할 수 있습니다.


하지만 SAS/Graph에 액세스할 수 없는 일부 사용자는 Proc GMap을 사용할 수 없습니다. SAS/Graph 라이선스가 없다면, Base SAS에 포함된 Proc SGplot을 사용하여 지도를 생성하는 방법도 있습니다. 바로 Proc SGplot에 포함된 polygon 스테이트먼트를 활용하여 지도 면을 그리고 거기에 색상을 입히는 방법입니다. 올바른 입력값 세트를 활용하면 이러한 폴리곤을 지도처럼 보이게 만들 수 있는데, 핵심은 올바른 입력값을 제공해야 한다는 것입니다!


우선 지도 폴리곤 데이터 세트를 확보해야 하는데, SAS/Graph가 제공하는 국가별 폴리곤 지도를 활용하면 편리합니다. Proc MapImport를 사용하여 ESRI 형상 파일(shape file)을 가져오는 방법도 있는데, 지도와 마찬가지로 Proc MapImport도 SAS/Graph에 포함되어 있다는 단점이 있습니다. 저는 우선 SAS/Graph를 사용할 수 있으므로 mapsgfk.us_counties를 사용해 보겠습니다.


지도 폴리곤 데이터 세트를 확보했지만 아직 완성된 것은 아닙니다. Proc GMap은 각 영역에 고유한 세그먼트 번호를 할당하는 방식으로 동일한 ID를 가지는 여러 개의 서로 다른 불연속 영역으로 이루어져 있는 지도 영역을 적당히 처리할 수 있습니다. 하지만 Proc SGplot 폴리곤에는 각 세그먼트마다 고유한 ID 변수가 필요합니다. 따라서 다음과 같은 코드를 사용하여 ID와 세그먼트 번호를 결합하는 새로운 ID 변수를 생성하겠습니다.


data maryland_map; set mapsgfk.us_counties (where=(statecode="MD"));

length id_plus_segment $50;

id_plus_segment=trim(left(id))||'_'||trim(left(segment));

original_order=_n_;

run;



이제 지도가 마련되었으니 응답 데이터를 지도에 결합해야 합니다. SAS에서 데이터 세트를 결합하는 방법은 다양한데, 저는 Proc Sql를 즐겨 사용합니다. 아래 코드를 사용하면 ID 변수(각 카운티마다 고유 ID 지정)를 사용하여 지도와 응답 데이터(폴리곤의 색상을 제어하는 데이터)를 결합할 수 있습니다. 단, Proc Sql이 지도 데이터 세트에서 관측 순서를 변경할 수 있으므로 원래 순서로 변경해야 한다는 점을 유의해야 합니다.


proc sql noprint;

create table combined as

select unique maryland_map.*, response.idname, response.region

from maryland_map left join response

on maryland_map.id=response.id;

quit; run;

proc sort data=combined out=combined;

by original_order;

run;



이제 다음 코드를 사용하여 메릴랜드주 지도를 색상을 입힌 폴리곤으로 플로팅할 준비를 마쳤습니다.


proc sgplot data=combined noborder noautolegend;

polygon x=x y=y id=id_plus_segment / group=region

   fill outline lineattrs=(color=cxcccc99) dataSkin=matte;

   styleattrs backcolor=cxcccc99 wallcolor=cxcccc99

   datacolors=(cx336633 cx993333 cx848421 cx29636b);

run;


행하면....






음... 하지만 축 표시가 보이지 않으면 더 좋을 것 같고, X축과 Y축 단위 비율도 동일하게 조정하는 것이 좋을 것 같네요. 가로 세로 비율을 정확하게 조정했다면, 이제 png 파일의 가로와 세로 크기를 지도에 '딱 맞게' 지정하면 됩니다.



ods graphics on / imagename="&name" height=5.25in width=9.2in;

proc sql noprint;

select (max(y)-min(y))/(max(x)-min(x)) into :aspect from combined;

quit; run;

proc sgplot data=combined noborder noautolegend aspect=&

polygon x=x y=y id=id_plus_segment / group=region

    fill outline lineattrs=(color=cxcccc99) dataSkin=matte;

   styleattrs backcolor=cxcccc99 wallcolor=cxcccc99

   datacolors=(cx336633 cx993333 cx848421 cx29636b);

xaxis display=none;

yaxis display=none;

run;


자... 점점 더 실제 지도처럼 보이시죠?!?



이제 텍스트 라벨을 몇 개 추가하려 합니다. Proc Gmap은 매우 유연하기 때문에 저는 주석을 사용해서 라벨을 추가했습니다. Proc Sgplot에도 이와 유사한 주석 기능이 있지만 구문은 약간 다릅니다. 주석 데이터 세트를 만들었다면 sganno= 옵션을 사용하여 주석 데이터 세트를 지정하면 됩니다.  


주석이 지정된 텍스트에 대한 정확한 구문(목록의 '글머리 기호'에 유니코드 문자 사용, "monotype corsiva" 글꼴로 북쪽 표시 화살표에 멋진 'N'자 사용 등)을 확인하려면 링크에서 전체 SAS 코드를 확인하시기 바랍니다.


다음은 주석이 지정된 텍스트를 입힌 최종 지도입니다.



Proc SGplot 작업은 Gmap 작업보다 약간 손이 더 많이 가지만 꽤 훌륭한 결과를 얻을 수 있습니다. Proc Gmap 이외의 SAS 소프트웨어를 사용하여 지리적 지도를 만들어 보신 적이 있다면 언제든 의견을 공유해 주세요!



 

저자

로버트 앨리슨 (Robert Allison) | 그래프 전문가