一、緣起

之前在跟一位學長討論畫圖的時候,遇到一個難題,當兩個變數的數值範圍存在很大差異時,該怎麼畫一幅

bar chart

。我的建議是加入一個副座標,將變數放入不同的尺度中。然後,在執行的過程中,仍遇到了技術上的困難。不過,最終透過一些小trick,實現了最終目的。

最終效果如下圖所示:

在Stata裡面,怎麼折騰一幅條形圖?

藉此機會,po主也向大家展示一下該怎麼折騰一幅

bar chart

二、新增副座標

下列資料中,

year

是年份,

people

是歷年農村貧困人口,

prate

是歷年貧困發生率,資料來源於《中國農村貧困監測報告(2019)》。

在Stata裡面,怎麼折騰一幅條形圖?

我們想要畫一個

bar chart

,展示近年來的減貧成效。由於

people

prate

的資料範圍完全不一樣,我們不能將其放入同一個座標系,那麼該怎麼辦呢?

我們可以為其中一個變數設定一個副座標

最終實現效果如圖:

在Stata裡面,怎麼折騰一幅條形圖?

程式碼的具體含義,容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))

,圖片就算完工了。最終效果如圖:

在Stata裡面,怎麼折騰一幅條形圖?

可是,有時候我們想加入圖片標籤,詳細展示這個

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

的標籤也以相同的形式處理。最終效果圖如下:

在Stata裡面,怎麼折騰一幅條形圖?

此時已經基本上大功告成了。

但是,部分期刊卻還會要求你提高黑白色的圖片,而不是彩色圖片,畢竟大部分期刊的黑白印刷,而不是彩印。此時,我們只需要加入一個主題

scheme(s2mono)

,就可以實現本文第一張圖所展示的效果了。

大家再欣賞一下這幅來之不易的圖片哈哈哈哈。。。

在Stata裡面,怎麼折騰一幅條形圖?

詳細程式碼展示如下:

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