温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 金振 (南开大学)
注:本推文编译自以下文档,相关数据也可通过该文档获取,特此致谢!
「Source: DuBoisChallenge-Stata」
目录
本文介绍的羊皮卷风格图形是源自一项以社会学家 Du Bois 命名的挑战,该项挑战的内容是复制 Du Bois 研究中的可视化效果。Du Bois 曾是著名的作家和民权运动者,同时作为社会学家使用可视化的数据讲述了美国黑人的坚韧与毅力受到社会公众的广泛关注。在 Du Bois 的研究中,他结合历史、社会统计和人口普查等相关数据绘制了 60 张图表,被视为首位将人口普查数据进行可视化处理的学者,同时也社会学领域研究种族主义的发起者之一。
Du Bois 的可视化探索是开创性的,他的绘图风格多是采用羊皮卷的形式展开,具体效果参见下图,本文主要介绍 ajstarks 发布在 GitHub 中的 Stata 指引代码。
代码如下:
twoway ///
(line year colored2, lcolor(black) lwidth(thin) lpattern(solid)) ///
(line year white2, lcolor(black) lwidth(thin) lpattern(shortdash)) ///
, ///
ytitle("") yscale(noline) ///
ylabel(1790(10)1890, labsize(2.5) noticks grid glwidth(0.05) glcolor(red) glpattern(solid) nogextend angle(horizontal)) ///
xtitle("PERCENTS.", size(2.6) alignment(bottom)) xscale(titlegap(2) outergap(0)) ///
xscale(noline) xlabel(0(5)100, labsize(2.2) labgap(zero) valuelabel noticks grid glwidth(0.05) glcolor(red) glpattern(solid) nogextend) ///
title("{fontface Rajdhani SemiBold: COMPARATIVE INCREASE OF WHITE AND COLORED}" "{fontface Rajdhani SemiBold: POPULATION OF GEORGIA.}", size(3.5)) ///
legend(order(1 "= COLORED" 2 "= WHITE") symplacement(north) rows(1) colgap(half) size(vsmall) region(fcolor(none) lpattern(blank)) position(6) span) ///
xsize(2) ysize(3) ///
graphregion(color("223 209 189")) plotregion(color("223 209 189") ilcolor(black) ilwidth(vthin))
语法要点:
red
, green
, blue
等)直接指定颜色,也可以通过设置 RGB 数值来指定颜色。参考指引代码,将 RGB设置为 “223 209 189” 或者 “227 217 205” 接近于羊皮卷的颜色;graphregion
:定义图区域属性,包括标题与副标题、图例、脚注等区域;
graphregion(color)
:设置图区域颜色;plotregion
:定义绘图区域属性,包括点、线、面等具体绘图区域;
plotregion(color)
:设置绘图区域颜色;plotregion(ilcolor)
:设置绘图区域轮廓颜色和透明度;plotregion(ilwidth)
:设置绘图区域轮廓厚度;title("{fontface Rajdhani SemiBold:#}")
:将标题字体指定为 Rajdhani SemiBold;lcolor
:设置线颜色;lwidth
:设置线厚度;lpattern
:设置线型;
lpattern(solid)
:实线;lpattern(shortdash)
:短虚线;lpattern(blank)
:线不可见;ytitle
:设置y轴标题yscale
:设置y轴属性;
yscale(noline)
:不要画轴线;ylabel
:设置y轴标签;
ylabel(labsize)
:设置y轴标签大小;ylabel(noticks)
:不设置轴标签刻度短线;ylabel(grid)
:设置网格线;ylabel(glwidth)
:设置网格线宽度;ylabel(glcolor)
:设置网格线颜色;ylabel(glpattern)
:设置网格线线型;ylabel(nogextend)
:网格线不延伸至绘图区域外;ylabel(angle(horizontal))
:设置y轴标签水平放置;region(ysize)
:设置区域着色和大小选项;
region(ysize)
:设置区域高度;region(xsize)
:设置区域宽度;legend
:设置图例。图片如下:
代码如下:
graph set window fontface "Rajdhani"
twoway ///
(area y12 x12, nodropbase fc("130 104 76") fi(100) lc(black) lw(0.02)) ///
(area y1 x1, nodropbase fc("219 206 186") fi(100) lc(black) lw(0.02)) ///
(area y2 x2, nodropbase fc("128 128 255") fi(100) lc(black) lw(0.02)) ///
(area y3 x3, nodropbase fc("255 214 0") fi(100) lc(black) lw(0.02)) ///
(area y4 x4, nodropbase fc("220 19 59") fi(95) lc(black) lw(0.02)) ///
(area y5 x5, nodropbase fc(white) lc(none) lw(vvthin)) ///
(area y6 x6, nodropbase fc("130 104 76") fi(100) lc(black) lw(0.02)) ///
(area y7 x7, nodropbase fc("219 206 186") fi(100) lc(black) lw(0.02)) ///
(area y8 x8, nodropbase fc("128 128 255") fi(100) lc(black) lw(0.02)) ///
(area y9 x9, nodropbase fc("255 214 0") fi(100) lc(black) lw(0.02)) ///
(area y10 x10, nodropbase fc("220 19 59") fi(95) lc(black) lw(0.02)) ///
(area y11 x11, nodropbase fc(white) lc(none) lw(vvthin)) ///
(scatter markery markerx, mc(none) ms(point) mlab(markerl) mlabpos(0) mlabc(black) mlabsize(1.8)) ///
(scatter marker3y marker3x, mc(none) ms(point) mlab(marker3l) mlabpos(3) mlabc(black) mlabsize(1.8) ) ///
(scatter marker4y marker4x, mc(none) ms(point) mlab(marker4l) mlabpos(9) mlabc(black) mlabsize(1.8) ) ///
(scatter markeryA markerxA, mc("220 19 59") msize(4) ms(circle) mlc(black) mlwidth(0.05)) ///
(scatter markeryB markerxB, mc("128 128 255") msize(4) ms(circle) mlc(black) mlwidth(0.05)) ///
(scatter markeryC markerxC, mc("255 214 0") msize(4) ms(circle) mlc(black) mlwidth(0.05)) ///
(scatter markeryD markerxD, mc("210 180 139") msize(4) ms(circle) mlc(black) mlwidth(0.05)) ///
(scatter markeryE markerxE, mc("219 206 186") msize(4) ms(circle) mlc(black) mlwidth(0.05)) ///
, ///
aspect(1) legend(off) ///
xlabel(-5(1)5) ylabel(-5(1)5) ///
xlabel(, nogrid) ylabel(, nogrid) ///
xscale(off) yscale(off) ///
xsize(1) ysize(1.1) ///
graphregion(color("227 217 205")) plotregion(color("227 217 205")) ///
title("{fontface Rajdhani SemiBold: OCCUPATION OF BLACKS AND WHITES IN GEORGIA.}",size(3.5)) ///
note("#DuBoisChallenge Nr. 3 made with #Stata. Source: https://github.com/ajstarks/dubois-data-portraits Plate 27." "By Asjad Naqvi (asjadnaqvi@gmail.com).", size(1.5))
语法要点:
area
:为图形添加阴影区域;nodropbase
:所绘制图形与 y 的第一个观测值与最后一个观测所围成的线设置为阴影区域;fc
:fcolor
缩写,填充颜色;fi
:fintensity
缩写,填充程度;lc
:lcolor
缩写,轮廓颜色;lw
:lwidth
缩写,轮廓厚度;scatter
:散点图;mc
:mcolor
缩写,散点颜色;ms
:msymbol
缩写,散点形状;mlab
:mlabel
缩写,散点标签;mlabpos
:mlabposition
缩写,散点标签的方向;mlabc
:mlabcolor
缩写,散点标签的颜色;mlabsize
:散点标签的大小;aspect
:设置绘图区域长宽关系;note
:添加注释。图片如下:
代码如下:
graph set window fontface "Rajdhani SemiBold"
twoway ///
(area free2 year, fcolor("46 139 87%90") fi(90) lwidth(none)) ///
(area slave year, fcolor(black) fintensity(100) lwidth(none)) ///
(scatter slave2 year, mcolor(none) mlabel(label) mlabsize(vsmall) mlabcolor(black) mlabposition(12)) ///
(scatter free2 year, mcolor(none) mlabel(year) mlabsize(small) mlabposition(12)) ///
(scatter y x in 1/2, mcolor(none) mlabel(lab2) mlabsize(4.5) mlabcolor(white) mlabposition(0)) ///
(scatter y x in 3, mcolor(none) mlabel(lab2) mlabsize(medsmall) mlabcolor(black) mlabposition(0)) ///
, ///
yscale(off) ylabel(, nogrid) ///
xscale(off) xscale(noline) ///
xlabel(1790(10)1870, noticks grid glwidth(vthin) glcolor(black) glpattern(solid) nogextend) ///
title("PROPORTION OF FREEMEN AND SLAVES AMONG AMERICAN BLACKS ." " " "PROPORTION DES NÈGRES LIBRES ET DES ESCLAVES EN AMÉRIQUE .", size(2.8)) ///
subtitle("DONE BY ATLANTA UNIVERSITY .", size(vsmall) position(12) margin(medlarge)) ///
note("#DuBoisChallenge Nr. 4 made with Stata. Source: https://github.com/ajstarks/dubois-data-portraits Plate 51." "By Asjad Naqvi (asjadnaqvi@gmail.com).", size(1.5)) ///
legend(off) ///
graphregion(color("223 209 189")) plotregion(color("223 209 189")) ///
xsize(3) ysize(4) aspectratio(1.05)
语法要点:
graph set window fontface "#"
:设置图片字体;subtitle
:设置副标题;
subtitle(margin)
:设置副标题白边大小;图片如下:
代码如下:
graph set window fontface "Rajdhani"
twoway ///
(scatter texty textx in 2/12, mc(none) ms(point) mlab(textt) mlabpos(0) mlabc(gs6) mlabsize(*0.7)) ///
(scatter texty textx in 1, mc(none) ms(point) mlab(textt) mlabpos(0) mlabc(gs6) mlabsize(*1.2)) ///
`curvetext' ///
`curvetext2' ///
(area y5 x5, nodropbase fi(100) fc("46 139 87") lc(black) lw(0.06)) ///
(area y4 x4, nodropbase fi(100) fc("30 144 255") lc(black) lw(0.06)) ///
(area y3 x3, nodropbase fi(100) fc("255 215 0") lc(black) lw(0.06)) ///
(area y2 x2, nodropbase fi(100) fc("220 20 60") lc(black) lw(vvthin)) ///
(line y1 x1, lc("220 20 60") lw(1.4) lp(solid)) ///
, ///
legend(off) ///
xlabel(-7(1)6, nogrid) ylabel(-5(1)16, nogrid) ///
xscale(off) yscale(off) ///
aspect(1.6) ///
xsize(2) ysize(3) ///
title("{fontface Rajdhani SemiBold: CITY AND RURAL POPULATION.}" "{fontface Rajdhani SemiBold: 1890.}", size(4.5)) ///
note("#DuBoisChallenge Nr. 6 made with Stata. Source: https://github.com/ajstarks/dubois-data-portraits Plate 11." "By Asjad Naqvi (asjadnaqvi@gmail.com).", size(1.5)) ///
graphregion(color("223 209 189")) plotregion(color("223 209 189"))
语法要点:
curvetext
:语法中两个暂元的设置是为图片下部螺旋状的曲线绘制。图片如下:
代码如下:
twoway ///
(line y1 x1, lc(black) lp(solid) lw(1.8)) ///
(line y1 x1, lc("202 55 78") lp(solid) lw(1.77)) /// // red
(line y2 x2, lc(black) lp(solid) lw(1.8)) ///
(line y2 x2, lc("210 198 176") lp(solid) lw(1.77)) /// // grey
(line y3 x3, lc(black) lp(solid) lw(1.8)) ///
(line y3 x3, lc("237 181 67") lp(solid) lw(1.77)) ///
(line y4 x4, lc(black) lp(solid) lw(1.8)) ///
(line y4 x4, lc("179 157 134") lp(solid) lw(1.77)) ///
(line y5 x5, lc(black) p(solid) lw(1.8)) ///
(line y5 x5, lc("160 160 170") lp(solid) lw(1.77)) ///
(line y6 x6, lc(black) lp(solid) lw(1.8)) ///
(line y6 x6, lc("230 180 173") lp(solid) lw(1.77)) ///
(scatter texty textx, mc(none) ms(point) mlab(textt) mlabpos(9) mlabc(gs6) mlabsize(2)) ///
, ///
aspect(1) legend(off) ///
xlabel(-2.5(0.5)3, nogrid) ylabel(-2.5(0.5)3, nogrid) ///
xsize(3) ysize(3.5) ///
xscale(off) yscale(off) ///
title("{fontface Rajdhani SemiBold: ASSESSED VALUE OF HOUSEHOLD AND KITCHEN FURNITURE}" "{fontface Rajdhani SemiBold: OWNED BY GEORGIA BLACKS .}", size(2.5)) ///
note("#DuBoisChallenge Nr. 7 made with Stata. Source: https://github.com/ajstarks/dubois-data-portraits Plate 25." "By Asjad Naqvi (asjadnaqvi@gmail.com).", size(1.2) span) ///
graphregion(color("223 209 189")) plotregion(color("223 209 189"))
语法要点:
note(span)
:注释的文本可以跨越整个图片区域,而非仅仅绘图区域。图片如下:
代码如下:
twoway ///
`areayellow' ///
`areared' ///
`areapink' ///
`areagrey' ///
`areagreen' ///
`areablue' ///
`areabrown' ///
`areasand' ///
(area _Y _X if _ID==19, nodropbase cmissing(n) fi(100) fc(black) lc(black) lw(0.06)) ///
(scatter _CY _CX if tag==1 & _ID==19, mc(black) msize(zero) mlabel(mylab3) mlabs(1) mlabc(white) mlabpos(0)) ///
(pcspike _CYm _CXm _CYo _CXo if tag==1 & (_ID==37 | _ID==47), lw(0.04) lc(gs10) lp(solid)) ///
(scatter _CY _CX if tag==1 & keeparrow==0, mc(black) msize(zero) mlabel(mylab3) mlabs(0.6) mlabc(black) mlabpos(12) mlabgap(zero)) ///
(pcarrow _CY1 _CX1 _CY _CX if tag==1 & _ID!=19 & keeparrow==1 & markerbelow==0, mc(black) msize(0.4) lw(0.06) lc(black) mlabel(mylab3) mlabs(1.1) mlwidth(0.06) mlabc(black) mlabpos(12) headlabel mlabgap(zero)) ///
(pcarrow _CY1 _CX1 _CY _CX if tag==1 & _ID!=19 & keeparrow==1 & markerbelow==1, mc(black) msize(0.4) lw(0.06) lc(black) mlabel(mylab3) mlabs(1.1) mlwidth(0.06) mlabc(black) mlabpos(6) headlabel mlabgap(zero)) ///
`areayellow2' ///
`areared2' ///
`areapink2' ///
`areagrey2' ///
`areagreen2' ///
`areablue2' ///
`areabrown2' ///
`areasand2' ///
(area _Yb _X if _ID==19, nodropbase cmissing(n) fi(100) fc(black) lc(black) lw(0.06)) ///
(scatter _CYb _CX if tag==1 & _ID==19, mc(black) msize(none) mlabel(mylab3) mlabs(1.2) mlabc(white) mlabpos(0)) ///
(pcspike _CYb _CX _CYob _CXo if tag==1 & (_ID==37 | _ID==47), lw(0.04) lc(gs10) lp(solid)) ///
(scatter _CYb _CX if tag==1 & keeparrow==0, mc(black) msize(zero) mlabel(mylab3) mlabs(0.6) mlabc(black) mlabpos(12) mlabgap(zero)) ///
(pcarrow _CYb _CX _CY1b _CX1 if tag==1 & _ID!=19 & keeparrow==1 & markerbelow==0 & birthplace!=., mc(black) msize(0.4) lw(0.06) lc(black) mlabel(mylab4) mlabs(1.1) mlwidth(0.06) mlabc(black) mlabpos(12) mlabgap(zero)) ///
(pcarrow _CYb _CX _CY1b _CX1 if tag==1 & _ID!=19 & keeparrow==1 & markerbelow==1 & birthplace!=., mc(black) msize(0.4) lw(0.06) lc(black) mlabel(mylab4) mlabs(1.1) mlwidth(0.06) mlabc(black) mlabpos(6) mlabgap(zero)) ///
(scatter texty textx, mc(none) ms(point) mlab(textt) mlabpos(0) mlabc(gs6) mlabsize(2)) ///
, ///
legend(off) xtitle("") ytitle("") ///
aspect(1.7) xsize(4) ysize(5) ///
xlabel(, nogrid) ylabel(, nogrid) ///
xscale(off) yscale(off) ///
title("{fontface Rajdhani SemiBold: MIGRATION OF BLACKS .}" "{fontface Rajdhani SemiBold: 1890 .}", size(4)) ///
note("#DuBoisChallenge Nr. 9 made with Stata. Source: https://github.com/ajstarks/dubois-data-portraits Plate 8." "By Asjad Naqvi (asjadnaqvi@gmail.com).", size(1.2) span) ///
graphregion(color("223 209 189")) plotregion(color("223 209 189"))
语法要点:
pcspike
:尖峰图;pcarrow
:箭头图;pcarrow(mlabgap)
:箭头标记与标签的距离。图片如下:
本推文展示了 6 个羊皮卷风格的 Stata 案例,具体操作应结合具体问题进行分析,学习运用可结合 Stata help 文档,希望能为图形美化提供一定的启发。
Note:产生如下推文列表的 Stata 命令为:
lianxh 绘图, m
安装最新版lianxh
命令:ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh