Stata绘图:自定义绘图利器-palettes

发布时间:2021-12-24 阅读 1092

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

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

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

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

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

⛳ Stata 系列推文:

PDF下载 - 推文合集

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


目录


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

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

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

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

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

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