Stata绘图:太美了!羊皮卷风格图形

发布时间:2022-01-04 阅读 3543

Stata 连享会   主页 || 视频 || 推文

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者: 金振 (南开大学)

邮箱: jinzhen59@163.com

注:本推文编译自以下文档,相关数据也可通过该文档获取,特此致谢!

Source: DuBoisChallenge-Stata」  


目录


1. 引言

本文介绍的羊皮卷风格图形是源自一项以社会学家 Du Bois 命名的挑战,该项挑战的内容是复制 Du Bois 研究中的可视化效果。Du Bois 曾是著名的作家和民权运动者,同时作为社会学家使用可视化的数据讲述了美国黑人的坚韧与毅力受到社会公众的广泛关注。在 Du Bois 的研究中,他结合历史、社会统计和人口普查等相关数据绘制了 60 张图表,被视为首位将人口普查数据进行可视化处理的学者,同时也社会学领域研究种族主义的发起者之一。

Du Bois 的可视化探索是开创性的,他的绘图风格多是采用羊皮卷的形式展开,具体效果参见下图,本文主要介绍 ajstarks 发布在 GitHub 中的 Stata 指引代码。

羊皮卷风格展示
羊皮卷风格展示

2. Stata代码介绍与图形展示

2.1 折线图

代码如下:

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” 接近于羊皮卷的颜色;
  • 字体方面,指引认为使用谷歌字体中提供的 Rajdhani更为接近 Du Bois 绘图的样式,图形绘制前需先安装本字体,具体设置可以通过设置图形首选项的功能进行;
  • 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 :设置图例。

图片如下:

折线图
折线图

2.2 饼图

代码如下:

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 的第一个观测值与最后一个观测所围成的线设置为阴影区域;
  • fcfcolor缩写,填充颜色;
  • fifintensity缩写,填充程度;
  • lclcolor缩写,轮廓颜色;
  • lwlwidth缩写,轮廓厚度;
  • scatter :散点图;
  • mcmcolor缩写,散点颜色;
  • msmsymbol缩写,散点形状;
  • mlabmlabel缩写,散点标签;
  • mlabposmlabposition缩写,散点标签的方向;
  • mlabcmlabcolor缩写,散点标签的颜色;
  • mlabsize :散点标签的大小;
  • aspect :设置绘图区域长宽关系;
  • note :添加注释。

图片如下:

饼图
饼图

2.3 块状图

代码如下:

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) :设置副标题白边大小;

图片如下:

块状图
块状图

2.4 螺旋图1

代码如下:

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 :语法中两个暂元的设置是为图片下部螺旋状的曲线绘制。

图片如下:

螺旋图1
螺旋图1

2.5 螺旋图2

代码如下:

    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) :注释的文本可以跨越整个图片区域,而非仅仅绘图区域。

图片如下:

图6
图6

2.6 美国地图

代码如下:

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) :箭头标记与标签的距离。

图片如下:

图7
图7

3. 结语

本推文展示了 6 个羊皮卷风格的 Stata 案例,具体操作应结合具体问题进行分析,学习运用可结合 Stata help 文档,希望能为图形美化提供一定的启发。

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:   lianxh 绘图, m 安装最新版 lianxh 命令:   ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh