2018年3月9日

〔SAS〕使用SGPLOT繪長條圖及折線圖

長條圖(Bar Chart)亦可以稱為柱狀圖、條圖、條狀圖、棒形圖等,應該是非常使用的圖形,與折線圖(Line Chart)一起繪製於同一張圖上,稱為Bar-Line Chart。

這次要分享的為Bar-Line Chart,統計圖結果如下:

Bar-Line Chart

先建立範例檔案,於【程式01】

/*程式01*/
data vbar_1;
     do i=1 to 200;
         do year=2012 to 2017;
             do week=1 to 7;
                 time=normal (1)*(10+(year-2011))+100+(year-2011)*10;
                 if uniform(1) >=(0.3-(year-2011)*0.02) then output;
             end;
         end;
     end;
run;

【程式02】先將我們需要會製圖型的統計量準備好。不過這非必要過程,繪長條圖SGPLOT可直接使用原始資料等,在選擇適當的統計量就可以,【程式04】會提到。

/*程式02*/
proc means data=vbar_1 noprint nway;
     class year;
     var time ;
     output out=vbar_2 (drop=_type_ _freq_ ) n=sum_time mean=mean_time;
run;

【程式03】為Bar-Line Cahrt的主要程式。

/*程式03*/
ods html gpath = "e:\temp\"  image_dpi=300  style=htmlblue;
ods graphics on / reset=all reset=index noborder height=6in width =6in
                                 antialiasmax=10000  imagename = "圖1" imagefmt =png ;
ods results off;

    proc sgplot data=vbar_2;
         format sum_time comma8.0 mean_time 5.1;
         styleattrs backcolor=white;
         vbar year / response=sum_time datalabel =sum_time
                          dataskin=pressed   legendlabel="案件數";
         vline year / response=mean_time y2axis datalabel =mean_time markers
                         dataskin=pressed datalabelpos=data legendlabel="平均受理時間(秒)" ;
         refline 1000/ lineattrs=(pattern=2 color=gray thickness=0.5%) axis=y;
         xaxis label="年度";
         yaxis label="件數"  values=(900 to 1300 by 50 );
         y2axis label="平均受理時間(秒)"  values=( 110 to 180 by 10 )
                  offsetmin=0.6 labelpos=datacenter;
         title j=c h=14pt '歷年受理處理案件統計';
     run;
ods results  on; title;quit;

「ods html」和「ods graphics」可讓統計圖直接輸出為檔案。

「vbar」為繪製(垂直)長條圖主要語法。如果要改為水平長條圖可用hbar。

「vline」為繪製(垂直)折線圖主要語法。如果要改為水平折線圖可用hline。其中語法y2axis為宣告折線圖的軸要用第二Y軸。

「refline」繪製參考線。於Y軸數值為1000的位置繪製一條參考線。

「xaxis」修改X軸。

「yaxis」修改Y軸。

「y2axis」修改第二Y軸。offsetmin將第二Y軸直到高度60%的位置。

「title」設定標題文字和格式。


【程式04】為直接使用原始資料等,以SGPLOT內建的統計功能產生統計量,同時於折線圖上加上標準差。主要差別請看有底線的語法。於實務上,【程式04】的方法比較實用。

/*程式04*/
ods html gpath = "e:\temp\"  image_dpi=300  style=htmlblue;
ods graphics on / reset=all reset=index noborder height=6in width =6in
                                 antialiasmax=10000  imagename = "圖2" imagefmt =png ;
ods results off;

    proc sgplot data=vbar_1;
         format i comma8.0 time 5.1;
         styleattrs backcolor=white;
         vbar year / response=i STAT=FREQ  datalabel =i dataskin=pressed  legendlabel="案件數";
         vline year / response=time STAT=MEAN LIMITSTAT=STDDEV  y2axis datalabel =time
                          markers dataskin=pressed datalabelpos=data legendlabel="平均受理時間(秒)" ;
         refline 1000/ lineattrs=(pattern=2 color=gray thickness=0.5%) axis=y;
         xaxis label="年度";
         yaxis label="件數"  values=(900 to 1300 by 50 );
         y2axis label="平均受理時間(秒)"  values=( 110 to 180 by 10 ) offsetmin=0.6 labelpos=datacenter;
         title j=c h=14pt '歷年受理處理案件統計';
     run;
ods results  on; title;quit;

Bar-Line Cahrt with SD

-------相關連結------

〔SAS〕使用SGPLOT繪製熱圖(Heatmap)
〔SAS〕以SGPANEL繪製熱圖組

沒有留言:

張貼留言