查看原文
其他

软件应用 | Stata绘图:太美了!羊皮卷风格图形

数据Seminar 2022-12-31

本文转载自公众号:连享会(ID:lianxh_cn

作者:金振 (南开大学)

邮箱:jinzhen59@163.com

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

「Source:DuBoisChallenge-Stata[1]

目录
  • 1. 引言

  • 2.Stata代码介绍与图形展示
    • 2.1 折线图
    • 2.2 饼图
    • 2.2 饼图
    • 2.4 螺旋图1
    • 2.5 螺旋图2
    • 2.6 美国地图
  • 3. 结语


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[2]更为接近 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 的第一个观测值与最后一个观测所围成的线设置为阴影区域;
  • fc : fcolor缩写,填充颜色;
  • fi : fintensity缩写,填充程度;
  • lc lcolor缩写,轮廓颜色;
  • lw : lwidth缩写,轮廓厚度;
  • scatter 散点图;
  • mc mcolor缩写,散点颜色;
  • ms msymbol缩写,散点形状;
  • mlab mlabel缩写,散点标签;
  • mlabpos  mlabposition缩写,散点标签的方向;
  • mlabc mlabcolor缩写,散点标签的颜色;
  • 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

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

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

3. 结语

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

参考资料

[1]

DuBoisChallenge-Stata: https://gitee.com/arlionn/DuBoisChallenge-Stata/tree/main

[2]

Rajdhani: https://fonts.google.com/specimen/Rajdhani


本文转载自公众号:连享会(ID:lianxh_cn),作者:连享会。




星标⭐我们不迷路!
想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧


往期推荐


统计计量 | 值得推荐的计量经济学论文

数据资源 | 八大板块!数据公开下载渠道(下)

数据资源 | 八大板块!数据公开下载渠道(中)

数据治理 | 带你学Python之面向对象编程基础

文章推荐 | 经典永流传:美国经济评论百年经典论文20篇(可下载)

数据资源 | 八大板块!数据公开下载渠道






数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


推荐 | 青酱


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存