在Stata裡面,怎麼折騰一幅條形圖?
一、緣起
之前在跟一位學長討論畫圖的時候,遇到一個難題,當兩個變數的數值範圍存在很大差異時,該怎麼畫一幅
bar chart
。我的建議是加入一個副座標,將變數放入不同的尺度中。然後,在執行的過程中,仍遇到了技術上的困難。不過,最終透過一些小trick,實現了最終目的。
最終效果如下圖所示:
藉此機會,po主也向大家展示一下該怎麼折騰一幅
bar chart
。
二、新增副座標
下列資料中,
year
是年份,
people
是歷年農村貧困人口,
prate
是歷年貧困發生率,資料來源於《中國農村貧困監測報告(2019)》。
我們想要畫一個
bar chart
,展示近年來的減貧成效。由於
people
和
prate
的資料範圍完全不一樣,我們不能將其放入同一個座標系,那麼該怎麼辦呢?
我們可以為其中一個變數設定一個副座標
。
最終實現效果如圖:
程式碼的具體含義,容po主一一道來。
use “picture。dta”, clear
gen year1 = year - 0。2
gen year2 = year + 0。2
#delimit ;
twoway (bar people year1, barw(0。4))
(bar prate year2, barw(0。4) color(white) lcolor(black) yaxis(2)),
xlabel(2010/2018) xtitle(“”) ylabel(1000(4000)18000)
ytitle(“貧困人口”) ytitle(“貧困發生率”, axis(2))
legend(ring(1) rows(1) order(1 “貧困人口” 2 “貧困發生率”))
graphregion(color(white));
#delimit cr
首先,調入資料之後,生成兩個年份變數,
year1
在原有基礎上減去
0。2
,
year2
在原有基礎上加上
0。2
,作為
bar chart
的橫座標。這麼做的原因是,
如果不降bar的橫座標分開,兩者繪圖時會重疊,此時我們只能看到一個bar
。
隨後引入
twoway
畫貧困人口的
bar
,將
bar
的寬度定義為
0。4
。再畫貧困發生率的
bar
,也將寬度定義為
0。4
。為了提高區分度,我們將第二個
bar
改為白色
color(white)
,外部線條則改為黑色
lcolor(black)
,並加入副座標
yaxis(2)
。
最後,加入座標和圖例,並將背景色也改為白色
graphregion(color(white))
,圖片就算完工了。最終效果如圖:
可是,有時候我們想加入圖片標籤,詳細展示這個
bar
的數值。但是,
bar chart
並沒有新增
mlabel
的
options
。我們只能曲線救國,引入散點圖
scatter
,來刻畫標籤。
程式碼如下:
#delimit ;
twoway (bar people year1, barw(0。4))
(scatter people year1, m(none) mlabel(people) mlabangle(90)
mlabposition(1) mlabcolor(black))
(bar prate year2, barw(0。4) color(white) lcolor(black) yaxis(2) )
(scatter prate year2, m(none) mlabel(prate) yaxis(2) mlabangle(90)
mlabposition(1) mlabcolor(black)),
xlabel(2010/2018) xtitle(“”) ylabel(1000(4000)18000)
ytitle(“貧困人口”) ytitle(“貧困發生率”, axis(2))
legend(ring(1) rows(1) order(1 “貧困人口” 3 “貧困發生率”))
graphregion(color(white)) ;
#delimit cr
我們在每個
bar
後面,新增一個
scatter
圖層,但是用
m(none)
命令,使其不顯示散點。再透過
mlabel(people)
新增標籤值。將標籤方向設定為
mlabangle(90)
,豎向排列,因為橫向排列的話,標籤值較為密集,會有重合的地方。將標籤置於一點鐘方向
mlabposition(1)
,並將字型設定為黑色
mlabcolor(black)
。
第二個
bar
的標籤也以相同的形式處理。最終效果圖如下:
此時已經基本上大功告成了。
但是,部分期刊卻還會要求你提高黑白色的圖片,而不是彩色圖片,畢竟大部分期刊的黑白印刷,而不是彩印。此時,我們只需要加入一個主題
scheme(s2mono)
,就可以實現本文第一張圖所展示的效果了。
大家再欣賞一下這幅來之不易的圖片哈哈哈哈。。。
詳細程式碼展示如下:
use “picture。dta”, clear
gen year1 = year - 0。2
gen year2 = year + 0。2
#delimit ;
twoway (bar people year1, barw(0。4))
(scatter people year1, m(none) mlabel(people) mlabangle(90)
mlabposition(1) mlabcolor(black))
(bar prate year2, barw(0。4) color(white) lcolor(black) yaxis(2) )
(scatter prate year2, m(none) mlabel(prate) yaxis(2) mlabangle(90)
mlabposition(1) mlabcolor(black)),
xlabel(2010/2018) xtitle(“”) ylabel(1000(4000)18000)
ytitle(“貧困人口”) ytitle(“貧困發生率”, axis(2))
legend(ring(1) rows(1) order(1 “貧困人口” 3 “貧困發生率”))
graphregion(color(white)) scheme(s2mono) ;
#delimit cr