Stata绘图:自定义绘图利器-palettes
2021-12-23
袁子晴
7474

连享会   主页 || 推文 || 知乎 || B 站 || 在线课堂

New! 搜推文,找资料,用 lianxh 命令:
安装: ssc install lianxh, replace
使用: lianxh 合成控制
       lianxh DID + 多期, w


⛳ Stata 系列推文:

PDF下载 - 推文合集

作者: 袁子晴 (香港大学)
邮箱: yzq0612@foxmail.com


目录
[[TOC]]


1. 问题背景

Stata 绘图需要美观的配色、节点符号和线型,但是自定义搭配又很繁琐并需要美学基础。为了简化上述操作,Ben Jann 开发了 palettes 包。具体来看,该包由 colorpalettecolorpalette9symbolpalettelineepalette 等 Stata 命令构成。grstyle 用这些命令来管理颜色、符号和线型。当然,它们也可以直接用于查看或检索调色板。需要注意的是,colorpalette 需要 Stata 14.2 以上版本。

2. 命令介绍

* 命令安装
net install gr0075, replace

colorpalette 命令有两种语法变体,分别对应于两种不同用途:

第一种:从一个或多个调色板中检索出所需的颜色组合,并返回至 r() 中以便后续绘图引用,语法如下:

colorpalette [argument] [, paletteoptions  graphoptions]

其中 argument 如下:

palette[[, palette options] / [ palette [, palette options] / ... ]]

第二种:仅用于浏览多个调色板,而不在 r() 中返回颜色。语法如下:

colorpalette [, palette options graph options]: pspec [ / pspec / ... ]

其中 pspec 如下:

palette [, palette options]

除此之外,调色板选项 palette options 包括:

  • n(#):指定调色板包含颜色的数量,大多情况默认选择前 # 种颜色,因此等价于选择 (1/#);部分调色盘会根据选择的颜色数量自适应调整;
  • select(numlist):选择并排序从调色板中获取的颜色;
  • reverse:以相反的顺序返回调色板;
  • intensity(numlist):用于调整颜色强度。0 到 1 之间的值使颜色变浅;大于 1 的值使颜色变深;可跟选择的颜色数量对应,指定多个数值;
  • opacity(numlist):设置不透明度程度 (需要 Stata 15)。该值必须在 0 (完全透明) 和 100 (完全不透明) 之间。同上,可指定多个数值。

常见的图形选项 graph options 包括:

  • title(string):指定自定义标题;
  • gropts(twowayoptions):提供传递给图形命令 twoway 的选项。

并且,语法 1 的附加图形选项还包括:

  • nograph:禁止生成调色板预览图;
  • rows(#):指定调色板预览图中不同色块排列的最小行数,默认为 5。

语法 2 的附加图形选项还包括:

  • horizontal:水平地显示调色板,默认水平显示;
  • vertical:垂直显示调色板;
  • plabels(strlist):为调色板提供自定义标签,用空格和双引号将标签括起来;
  • lcolor(colorstyle):指定自定义的轮廓颜色,默认是使用与填充色相同的颜色;
  • lwidth(lineewidthstyle):指定一个自定义的轮廓厚度,默认值是 lwidth(vthin)

与此同时,语法 1 命令返回值 r(),为后续绘图调用色板提供了方便,建议结合后续实例理解:

  • Scalar:r(n) 颜色的数量;
  • Macros:
    • r(ptype) 颜色;
    • r(p#):第 # 个颜色;
    • r(p):以空格分隔的颜色列表;
    • r(pnote):调色板备注 (如适用);
    • r(pname):调色板的名称;
    • r(p#info):第 # 个颜色的信息 (如适用)。

3. Stata 实例

3.1 引用调色板的颜色组合

查看 colorpalette 命令语法 1 返回值 r() 中的颜色组合,以便在随后的绘图命令中使用。r(p) 包含带有空格分隔的颜色列表,r(p1)r(p2) 等包含第一个和第二个的单色。下面的折线图是用 ColorBrewer 中的 Set1 调色板绘制的 (指定选项 nograph 以防止 colorpalette 显示调色板)。

. sysuse uslifeexp, clear
. lab var le_wfemale "white females"
. lab var le_wmale   "white males"
. lab var le_bfemale "black females"
. lab var le_bmale   "black males"
. * 选择调色板 Set1
. colorpalette Set1, select(1/3 5) nograph
. * 查看返回内存的r()
. return list
. * 绘图中颜色选择上述命令返回的色盘
. line le_wfemale le_wmale le_bfemale le_bmale year, lcolor(`r(p)') lwidth(*2 ..) ///
>      ytitle(Life expectancy)

如果不想每次绘图前都运行 colorpalette 命令,就可将其返回的颜色列表保存在暂元中,以便后续调用:

. local mycolors `"`r(p)'"'   // 保存存在局部暂元中
. colorpalette Accent, locals // 或者附加局部暂元的选项
. colorpalette Fuchsia Tomato SteelBlue SeaShell, globals // 或者附加全局暂元选项

在下面的案例中,我们更详细地展示了 colorpalette 命令的使用:

*-1. 导入示例数据
lxhget covid_data2.csv, replace
import delim using covid_data2.csv, clear delim(",")

*-2. 初步清洗
drop id
encode country, gen(id)
gen date2 = date(date, "DMY")
format date2 %tdDD-Mon-yy
drop date
ren date2 date
order id country date
lab var date "Date"
lab var total_cases_pop_ma7 "Cases per million population (7 day MA)"

*-3. 根据最近一天的新冠确诊数量建立排名
summ date
gen tick = 1 if date == `r(max)'  // mark the last entry
egen rank = rank(total_cases_pop_ma7) if tick==1, f

levelsof country, local(lvls)
foreach x of local lvls {
    display "`x'"
    qui summ rank if country=="`x'"
    cap replace rank = `r(max)' if country=="`x'" & rank==.
}
   
*-4. 为每个国家建立标签
gen marker = country + " (" + string(total_cases_pop, "%9.0fc") + ")" if tick==1

*-5. 安装自定义绘图主题
net install cleanplots, from("https://tdmize.github.io/data/cleanplots")
set scheme cleanplots
graph set window fontface "Arial Narrow"

*-6. 引用调色板进行绘图
levelsof rank, local(lvls)   
local items = r(r)
foreach x of local lvls {
    colorpalette viridis, n(`items') nograph
    local customline `customline' (line total_cases_pop_ma7 date if rank == `x', ///
    lc("`r(p`x')'") lp(solid) lw(*0.8)) ||
}
summ date
local start = r(min)
local end   = r(max) + 30

twoway `customline' (scatter total_cases_pop_ma7 date if tick==1,       ///
    mcolor(black%25) msymbol(circle) msize(*0.1) mlabel(marker)         ///
    mlabsize(*0.55) mlabcolor(black)), xlabel(`start'(15)`end',         ///
    labsize(vsmall) angle(vertical)) ytitle(, size(small)) xtitle("")   ///
    title("{fontface Arial Bold: COVID-19 cases per million for European countries}") ///
    note("Source: ECDC via Our World in Data", size(vsmall)) legend(off)

如果你想完全自定义颜色,比如使用网站「黄到蓝渐变颜色组合」,那么可以参考下面案例,直接在 colorpalette 命令后面加上每种颜色对应的 RGB 值并用空格分隔开,即可得到如下效果:

*https://www.color-hex.com/color-palette/96712 (Sunflower Plum)
local customline // reset the local
levelsof rank, local(lvls)   
local items = r(r)
foreach x of local lvls {
    colorpalette "238 234 196"  ///
                 "201 198 179"  ///
                 "144 161 163"  ///
                 "85  110 120"  ///
                 "27  68  88"   ///
     , ipolate(`items', power(0.8)) reverse nograph 
    local customline `customline' (line total_cases_pop_ma7 date if rank == `x', ///
          lc("`r(p`x')'") lp(solid) lw(*0.8)) ||
  }
summ date
local start = r(min)
local end   = r(max) + 30
twoway `customline' (scatter total_cases_pop_ma7 date if tick==1, mcolor(black%25)  ///
    msymbol(circle) msize(*0.1) mlabel(marker) mlabsize(*0.55) mlabcolor(black)),   ///
    xlabel(`start'(15)`end', labsize(vsmall) angle(vertical)) ytitle(, size(small)) ///
    xtitle("") ///
    title("{fontface Arial Bold: COVID-19 new cases per million for European countries}") ///
    note("Source: ECDC via Our World in Data", size(vsmall)) ///
    legend(off)

3.2 调色板预览

3.2.1 单一调色板预览

首先,我们简要地预览几个现有的调色板的颜色组合,colorpalette 生成的预览图显示颜色、名称、代码及附加信息:

. colorpalette economist

下面是用户制作的一个带有 RGB 代码和标签的调色板:

. colorpalette lin, fruits

同样地,预览默认的符号点型:

. symbolpalette default

预览默认的线型样式:

. linepalette default

3.2.2 多个调色板预览

. symbolpalette: default / lean / tufte / pplain / pblind

要预览多个调色板时可用斜杠分隔不同调色板,选项 lcolor(black) 被指定用来在色域周围画黑线:

. colorpalette, lcolor(black): Accent / Dark2 / Set1 / Set3
. colorpalette lin, fruits / lin, vegetable / lin, food select(1/6) title("Edibles")

下面的例子展示了 HCL 颜色生成的默认方案,垂直选项的效果和决定颜色的数量 n()的使用:

. colorpalette, vertical n(40): hcl, blues / hcl, greens / hcl, oranges / hcl, purples / hcl, heat / hcl, plasma

3.3 其他选项设定

3.3.1 自定义颜色列表

你可以通过指定颜色风格 (命名的颜色、RBG 值、CMYK 值或 HSV 值) 列表来自定义调色板:

. colorpalette blue brown cranberry emerald forest_green gold green khaki ///
>     lavender lime magenta maroon mint navy olive olive_teal orange      ///
>     orange_red pink purple red sand sienna teal, title(Some named colors)

除此之外,你还可以使用 HCL 代码 (输入 "hcl h c l",其中 hcl 是色调、色度和亮度的值) 或「十六进制代码」来指定颜色:

. colorpalette #bd1e24 #e97600 #f6c700 #007256 #0067a7 #964f8e, rows(2) title(FS 595 Safety Colors)

3.3.2 强度或不透明度设定

intensity()opacity() 选项可以调整颜色强度和不透明度:

. colorpalette cranberry, intensity(0.1(.05)1)

3.3.3 自定义调色板

创建一个自己命名的调色板:

program colorpalette_bootstrap3
    c_local P #337ab7,#5cb85c, #5bc0de,#f0ad4e,#d9534f
    c_local I primary,success,info,warning,danger
    end
colorpalette bootstrap3

3.3.4 预设的调色盘

Stata 15 自带了 5 个调色盘分别是:s1s1rs2economistmono,用户额外贡献了以下调色盘:cblindplottig538mrctflburdlean,预览图如下:

4. 相关推文

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

资源共享


尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。
请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。
我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。more……
  • 扫码加入连享会微信群,提问交流更方便