如何用Stata作漂亮的圖?來看超詳細教程!
概要
本文涉及到的內容包括,在拿到一個數據集後:
如何使用list、describe命令,初步了解數據集;
如何使用codebook、summarize命令了解某一個變數x的缺失值、統計量,並使用stem、graph box、histogram命令畫出莖葉圖、箱式圖以及柱狀圖;
如何使用twoway graphs來展示數值型變數x和y之間的關係,並畫出散點圖(scatter plot)、折線圖(line plot)、帶數據標記的直線圖(connected plot)等多種圖像;
如何使圖像變得更加美觀。
下面,我們通過例子來了解這些命令。本次使用的是1900-1999年美國期望壽命的數據,這是Stata 14.0自帶的一個資料庫。
提醒:
(1)使用Stata時,盡量不用命令框,而最好使用do file編寫命令。這樣可以保證操作的可重複性。
(2)本文中,所有命令以黃色背景、粗體、藍色字體顯示。
(3)do file中命令末尾的雙斜線//表示添加註釋(例如,圖0.1.1第6行set linesize 255後為注釋),三斜線///表示換行(例如,圖0.1.1從第8行到16行為一個完整的命令,其中使用///換行)。
圖0.1.1
1. 導入數據並觀察
為了方便大家學習,我們在本教程中使用Stata自帶的數據uslifeexp.dta,大家可以輸入sysuse dir這行命令查看系統自帶的資料庫(圖1.1.1)。若沒有uslifeexp這個資料庫。
圖1.1.1 Stata 14.2自帶的資料庫
. sysuse uslifeexp
這一步的目的是導入該系統自帶數據。屏幕顯示的結果如下。
. list in 1/10
通過這個命令,我們可以查看該資料庫第1到第10個數據,對數據有一個初步的了解。屏幕顯示的結果如下。
. describe
2. 單變數探索以及作圖
在這一小節中,我們一起來對某一個變數進行探索。我們會用到四個命令,分別是codebook、summarize、stem以及histogram。我們以數據集中的變數le (life expectancy)為例。這個變數是人均預期壽命。
2.1 Codebook
Codebook這個命令適合於我們初次接觸一個數據集的變數。
. codebook le
2.2 Summarize
Summarize這個命令可以讓我們更加深入地探索變數的統計量。
. summarize le
下圖是summarize le這行命令的結果,給出最常用的幾個統計量。
而summarize le, detail這行命令則會給出更多的統計量。
. summarize le, detail
其中,smallest和largest代表了該變數最大和最小值,即預期壽命(le)的4個最高值和4個最低值。
2.3 其他圖像
為了探索變數的分布,我們還可以使用莖葉圖(stem plot)、箱式圖(box plot)、直方圖(histogram)等圖像進行探索。
. stem le
. graph box le(左圖)
. hist le(右圖)
** hist是histogram的縮寫。在Stata中,一些命令有縮寫形式,如summarize可以縮寫為sum。
由於篇幅有限,對於這些圖像,我們在此不做贅述。但是我們應該記住,莖葉圖的莖寬、保留位數;直方圖的組距、顏色、y軸是頻率還是頻數等都可以進行自定義,直到畫出滿意的圖像。感興趣的讀者可以在命令行中輸入help stem、help graph box、help histogram獲取help文件。如還有不清楚的地方,可以聯繫小咖獲取幫助。
3. 雙變數作圖
在這一小節中,我們對於雙變數進行繪圖。我們繼續研究預期壽命(le)隨年份(year)變化的規律。不同的是,我們使用le_male與le_female繪製2個y變數和x的圖,使用le_wmale、le_wfemale、le_bmale、le_bfemale繪製4個y變數和x的關係。
. twoway plot [if] [in] [, twoway_options]
twoway的命令是twowayplot變數[if] [in] [, twoway_options],我們可以自己定義的主要是:
plot:選擇圖像的種類,這裡的plot可以改成scatter, plot, connected, area, bar等,我們可以繪製出相應的圖。
變數:這裡可以寫一個或多個y變數,一個x變數。最後一個是x變數,之前的為y變數。
[if] [in] [, twoway_options]等中括弧內的命令是可選命令,如果不寫,則表示默認值。
if:定義所取某一個自變數的範圍,例如if le > 40,即只畫le>40的圖
in:定義所取觀測值的範圍,例如in 10/20,即只畫第10到20個觀測值的圖
twoway_options:可以定義圖像的「美觀」部分,例如坐標軸範圍、標題、注釋、標籤等等。
3.1 一個y變數(預期壽命(le)隨年份(year)變化的關係)
twowayploty x,其中plot可以換為某種特定的圖像,如scatter。
-散點圖
下圖Stata代碼:
. twoway scatter le year
圖2.1.1 散點圖
-折線圖
. twoway line le year
圖2.1.2 折線圖
同理,我們還可以做出更多種的圖。
. twoway connected le year(左上,帶數據標記的折線圖)
. twoway dropline le year(右上,垂直線圖)
. twoway spike le year(左下,脈衝圖)
. twoway lowess le year(右下,lowess圖)
圖2.1.3
大家可以輸入help graph_twoway,查看Stata都可以做出什麼樣的圖。
3.2 多個y 變數
命令形式:graph twoway plot yvar1 yvar2 yvar3 … xvar
plot表示我們要畫的是某種圖,之後是變數的名字。
Stata會默認最後一個變數是x變數,plot和x變數之間則均為y變數。
下圖Stata代碼:graph twoway scatter le_male le_female year
圖3.2.1
下圖Stata代碼:twoway line le_male le_female year
圖3.2.2
下圖Stata代碼:twoway area le_female le_male year
圖3.2.3
下圖Stata代碼:twoway line le_wmale le_wfemale le_bmale le_bfemale year
圖3.2.4
注意:
在Stata中,上述命令graph twoway plot yvar1 yvar2 yvar3 xvar和下列命令等價:
- graph twoway (plot yvar1 xvar) (plot yvar2 xvar) (plot yvar3 xvar)
- graph twoway plot yvar1 xvar || plot yvar2 xvar || plot yvar3 xvar
. twoway scatter le_m le_f year
. twoway (scatter le_m year) (scatter le_f year)
. twoway scatter le_m year || scatter le_f year
(以上3個命令等價,畫出下圖)
圖3.2.5(同3.2.1)
因此,我們完全可以在同一張圖上畫出不同y變數。
(以上1-4行為第一個命令,6-9行為第二個命令,兩個命令等價,畫出下圖)
圖3.2.6
也可以將yvar1的兩種不同的曲線畫在同一幅圖上。
. twoway (scatter le year) (lfit le year)
. twoway scatter le year || lfit le year
(以上2個命令等價,畫出下圖)
圖3.2.7
4. 改變點的大小形狀,
改變線的粗細、樣式
在這一節,我們主要講對於點和線的處理。我們重新回到男、女預期壽命比較這幅圖(圖3.2.1)。
下圖的Stata代碼:graph twoway scatter le_male le_female year
圖4.1.1(同3.2.1)
對於這幅圖,我們沒有定義點的顏色、形狀、大小等等參數,而是接受了Stata給出的默認值。我們也可以對此進行更改。
例如:
下圖的Stata代碼(藍色背景部分為新增內容):
graph twoway scatter le_male le_female year,mcolor(red blue) msymbol(circle diamond) msize(vsmall vsmall)
圖4.1.2(圖3.2.1改進)
在這行code中,我們調整了點的顏色(mcolor),形狀(msymbol),大小(msize)。括弧里的順序(red blue)應按照y變數的順序 (le_male le_female) 依次對應,這樣紅色代表le_male,blue代表le_female。
除了點的顏色、形狀、大小外,Stata還給了我們多種改進的方案,如點內部顏色、點外周顏色、點外周寬度等等。讀者可以通過在命令行里輸入help scatter##marker_options得到更加詳盡的介紹。
我們也可以更改連線的屬性。讓我們回到3.2.2這幅圖。
下圖Stata代碼:twoway line le_male le_female year
圖4.1.3(同圖3.2.2)
對於這幅圖,我們同樣可以改進。
下圖Stata代碼(藍色背景部分為新增內容):
twoway line le_male le_female year,lcolor(red blue) lpattern(solid dash) lwidth(thin thin)
圖4.1.4(圖3.2.2改進)
在這行code中,我們調整了線的顏色(lcolor),連接方式(lpattern),寬度(lwidth)。括弧里的順序(red blue)應按照y變數的順序 (le_male le_female) 依次對應,這樣紅色代表le_male,blue代表le_female。
除了線的顏色、連接方式、寬度外,Stata還給了我們多種改進的方案。
5. 改進圖像整體
在下圖分性別和人種的預期壽命比較中,1920年的預期壽命看起來近似於0,但其實是30左右。
圖5.1.1(同圖3.2.4)
上圖Stata代碼:twoway line le_wmale le_wfemale le_bmale le_bfemale year
我們怎樣調整坐標軸的範圍、單位,以更適應我們的預期呢?
(1)改變坐標軸的最大值、最小值
下圖代碼(藍色背景部分為新增內容):
. twoway line le_wmale le_wfemale le_bmale le_bfemale year,yscale(range(0))
yscale(range(0)) 要求y軸的範圍包括0
圖5.1.2
下圖代碼(藍色背景部分為新增內容):
. twoway line le_wmale le_wfemale le_bmale le_bfemale year,yscale(range(0 90))
※ yscale(range(0 90)) 要求y軸的範圍包括0到90
圖5.1.3
同理,我們也可以改變使用xscale(range())來改變x軸的範圍。
(2)改變坐標值的刻度
在圖3.1.2中,我們雖然包含了0和90,但是圖看起來仍然很醜,因為y軸的刻度值仍然是從30到80。因此我們要改變坐標軸刻度的起止點和範圍。
下圖代碼(藍色背景部分為新增內容):
. twoway line le_wmale le_wfemale le_bmale le_bfemale year, yscale(range(0 90))ylabel(0(10)90)
※ ylabel(0(10)90)的意思是y軸的刻度從0開始,到90結束,每隔10添加一個刻度
圖5.2.1
同理,對於x軸,我們希望每隔5年標記一個刻度。我們加上了xlabel(1900(5)2000)
下圖代碼(藍色背景部分為新增內容):
twoway line le_wmale le_wfemale le_bmale le_bfemale year, ///
yscale(range(0 90)) ylabel(0(10)90)xlabel(1900(5)2000)
圖5.2.2
然而,現在x軸的坐標重疊到了一起,不是很好看清楚。
我們將xlabel稍作更改:xlabel(1900(5)2000)改為xlabel(1900(10)2000) ,並加上了xtick(1900(5)2000)。我們使用xtick(1900(5)2000),意味著每隔5年在x軸上加一個小標記,而xlabel(1900(10)2000)意味著每隔10年在x軸上寫上具體的年份。
下圖代碼(藍色背景部分為新增內容):
twoway line le_wmale le_wfemale le_bmale le_bfemale year, ///
yscale(range(0 90)) ylabel(0(10)90)xlabel(1900(10)2000) xtick(1900(5)2000)
圖5.2.3
?
(3)加標題
現在,我們添加了title("20世紀美國預期壽命變化圖") subtitle("1900年-2000年") ytitle("預期壽命") xtitle("年份"),其中:
用title("20世紀美國預期壽命變化圖") 給圖像加上大標題;
用subtitle("1900年-2000年")加上小標題;
用ytitle("預期壽命")給y軸加上標題;
用xtitle("年份") 給x軸加上標題。
下圖代碼(藍色背景部分為新增內容):
圖5.3.1
還可以加上說明文字和注釋。
下圖代碼(藍色背景部分為新增內容):
圖5.3.2
(4)改變圖例
在Stata中,圖例默認按照變數的標籤(label)添加,堆積在圖像的底部。我們怎麼能把圖例做得更美觀呢?比如,加上中文?改變位置?改變排列順序?我們可以添加legend()選項進行改變。
在下圖中,我們添加了legend(ring(0) pos(5) label(1 "白人男性") label(2 "白人女性") label(3 "黑人男性") label(4 "黑人女性") cols(1)),其中:
ring(0)代表把圖例放在圖像內部;
pos(5)代表了圖例在圖像的5點鐘的位置(和鐘錶的數字位置相同);
label改變了圖例的文字,從1-4對應著命令中le_wmale le_wfemale le_bmale le_bfemale的順序;
cols(1)代表希望他們在一列中顯示(同理,rows(1)代表希望同一行顯示)。
下圖代碼:
圖5.3.3
看完本文,是不是對Stata作圖有一些了解呢?有任何不明白的地方,歡迎在文章下方留言哦~~如果想獲取本教程的PDF電子版或do file,也請在下方留言中留下郵箱,小咖發到你郵箱!
※KM法生存分析,史上最詳細的SPSS教程!
※統計方法套路深,細說I類錯誤和II類錯誤!
TAG:醫咖會 |