[SAS] 製作長條圖(Bar chart) — Advanced

YC Huang
9 min readJan 31, 2024

--

看完長條圖基礎篇,你可能會想問:如果我今天想改長條圖顏色?如何加上其他分佈(distribution)的圖?或者如何表現兩個y軸呢?一起來看看下面這個例子吧!(複製程式碼在文章最底端)

接續基礎篇的資料集,如果我們希望將長條圖由橫向改為直相呢?因為orient在SAS程式語言當中預設為橫向,我們只需要將第十一行的 ’orient=horizontal’ 拿掉即可(由圖1變為圖2)。

圖1:(截自[SAS] 製作長條圖-基礎篇)
圖2
圖3:圖2之結果

假設我們對於長條圖裡面的填充顏色不滿意,可以執行以下程式進行更換:

圖4:更換長條圖顏色程式碼

Barwidth:長條圖的寬度,可以調整成適合的寬度大小
fillattrs:填充長條圖的顏色,圖3是預設的顏色,圖5是將長條圖填充更換成黃色的結果。除了常見的顏色可以用敘述(red, blue, green, yellow, etc.)外,可以透過直接給色號更換顏色,色號對照可以參考這個

圖5:將長條圖顏色修改

試著想像我們想了解各個年齡的人數分佈,針對不同年紀,希望圖表能同時表現出各個年齡層學童的平均BMI(體重(kg)/(身高(m)²))和各個年齡層的男女生人數。首先我們複習一下原始資料長相,因為身高/體重與年齡不符合,假設身高單位為英吋、體重為英磅,透過運算轉換為BMI單位的計算方式:

圖6
圖7:資料整理

圖7程式碼中,第八行至第十四行產出第一個資料集class,雖然和原始資料集名稱相同,但因為放置的libref不同,一個放在sashelp當中,另一個放在work當中,兩者並不會交互影響,透過公式的計算BMI並且四捨五入至個位數,產出的資料及結果如下:

圖8:work.class

圖7程式碼當中,第十五和十六行產出第二個資料集BMI,根據不同年齡和性別進行分組(group by age, sex),我們可以在c欄位得到每個年齡性別有多少同學,最終將BMI資料集放入proc template當中。

圖9:work.BMI
圖10:proc template程式碼

圖10乍看整段程式碼看起來很長,我們可以朝三個大方向來解析,圖基本設定、長條圖、折線圖。

標題(包含座標軸標題、圖片標題等等)和圖基礎設定:

  1. 將template命名為Barchart_color2,並在第七十八行 entrytitle 設定圖表名稱’Numbere of students by sex and age’。
  2. 第八十和八十一行分別設定圖表的x軸和y軸標題,須注意這邊y軸標題沒有特別使用option設定為水平,系統預設會改為垂直於x軸。
  3. 針對y軸,我們希望顯示值能在0~5之間且每次增加1個單位,可以直接參考程式碼第八十二行。
  4. 因為我們希望能夠有兩個y軸呈現不同數據,因此第八十四行給定y2axisopts。最大最小值希望分別落在0和25之間,給定viewmin和viewmax。因為進階篇長條圖的設定較基礎篇複雜許多,尤其需要注意分號的位置,第一階段包含圖標題、座標軸標題、座標軸最大最小值已經設定完成,第八十六行給定一個分號。

長條圖(bar chart):

  1. 第八十七行開始,我們進行barchart內容設定。類別為年紀(category=age),反應變數為計算的總學生數(response=num)。
  2. 能根據不同年紀做分組(group=sex)。
  3. 給予每個分組計算所得到的數據(barlabel=true)且根據不同分組給予不同顏色(groupdisplay=cluster)。

折線圖(line chart):

  1. 第九十行開始,折線圖(linechart),根據年紀分類(category=age),反應變數bmi做出折線圖統計數據(response=bmi)。
  2. 圖中每個折線點均須呈現所計算的數字(vertexlabel=true),並且希望這些標示值為粗體和點的顏色一致為深藍色(vertexlabelattrs=(color=darkblue weight=bold))。
  3. stat=means表示我們在反應變數的部分,將會以統計中的「平均值」作呈現。另一個比較特殊的是y軸在右邊(yaxis=y2)和既定印象不同。
  4. 假設折線圖希望有點和線,我們需要設定display = (line markers)。針對「點」可設定是否為實、內部上色顏色、形狀等均可以客製化,若希望設定成圖11一樣,直接參考第九十四行即可。
  5. 做到這邊會發現線的顏色漏了,可參考第九十五行lineattrs=(color=darkblue)。折線圖第2.步驟開始,若沒有針對顏色設定,SAS會default認為是黑色唷!若大家想設定其他特殊顏色,可以參考最下方reference,SAS裡面也可以直接給色彩號碼進行設定。
圖11:根據不同性別年紀分組,人數分佈及BMI值
/*vertical bar chart*/
proc template;
define statgraph barchart;
begingraph;
entrytitle "Gender";
layout overlay/yaxisopts=(label="Number of students");
barchart category=sex response=num / name="bar" ;
endlayout;
endgraph;
end;
run;

proc sgrender data=gender template=barchart;
run;

/* diff colors*/
proc template;
define statgraph barchart_color;
begingraph;
entrytitle "Gender";
layout overlay/yaxisopts=(label="Number of students");
barchart category=sex response=num / barwidth=0.5 fillattrs=(color=yellow) name="bar" ;
endlayout;
endgraph;
end;
run;

proc sgrender data=gender template=barchart_color;
run;

/* data set generation*/
proc sql noprint;
create table class as
select name, sex, age,
height*2.54/100 as h_m,
weight*0.45 as w_kg,
round(weight*0.45/((height*2.54/100)*(height*2.54/100)), 1) as BMI
from sashelp.class
;
create table bmi as select count(name) as c, bmi, age, sex
from class group by age, sex
;
quit;

/*combine line chart with bar chart*/
proc template;
define statgraph barchart_color2;
begingraph / attrpriority=none;
entrytitle "Number of students by Sex and Age";
layout overlay /
xaxisopts=(label="Age (years)")
yaxisopts=(label="Number of students"
linearopts=(tickvaluesequence=(start=0 end=5 increment=1)
tickvaluepriority=true))
y2axisopts=(label="BMI (kg/m^2)" offsetmin=0
linearopts=(viewmin=0 viewmax=25))
;/*bar chart*/
barchart category=age response=num/ name="bar_age"
group=sex groupdisplay=cluster
barlabel=true
;/*line chart*/
linechart category=age response=bmi/
vertexlabel=true vertexlabelattrs=(color=darkblue weight=bold)
name="line" stat=mean yaxis=y2 display=(line markers)
markerattrs=(symbol=circlefilled color=darkblue)
lineattrs=(color=darkblue)
;
/* discrete label*/
discretelegend "bar_age";
endlayout;
endgraph;
end;
run;

proc sgrender data=bmi template=barchart_color2;
run;

reference:
color in SAS https://support.sas.com/content/dam/SAS/support/en/books/pro-template-made-easy-a-guide-for-sas-users/62007_Appendix.pdf

--

--

YC Huang

嗨嗨我是一個喜歡資料視覺化的小小工程師,目前專注於SAS和臨床統計,希望文章能更多關於什麼主題呢?歡迎留言給我