查看原文
其他

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

连享会 连享会 2023-10-24


👇 连享会 · 推文导航 | www.lianxh.cn

连享会寒假班

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


目录

  • 1. 问题背景

  • 2. 命令介绍

  • 3. Stata 实例

    • 3.1 引用调色板的颜色组合

    • 3.2 调色板预览

    • 3.3 其他选项设定

  • 4. 相关推文



温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

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

  • 专题:Stata教程
    • 普林斯顿Stata教程(二) - Stata绘图
  • 专题:Stata绘图
    • 史上最牛Stata绘图模版-schemepack:酷似R中的ggplot2-袁子晴
    • Stata绘图:addplot-层层叠加轻松绘图
    • Stata 绘图:用 Stata 绘制一打精美图片-schemes
    • 常用科研统计绘图工具介绍
    • Stata空间计量:莫兰指数绘图moranplot命令介绍
    • Stata绘图-组间差异可视化:不良事件火山图、点阵图
    • Stata绘图极简新模板:plotplain和plottig-T251
    • 给你的图形化个妆:Stata绘图常用选项汇总-上篇
    • 给你的图形化个妆:Stata绘图常用选项汇总-下篇
    • Stata绘图:柱状图专题-T212
    • Stata绘图:回归系数可视化-论文更出彩
    • Stata绘图:世行可视化案例-条形图-密度函数图-地图-断点回归图-散点图
    • Stata绘图:随机推断中的系数可视化
    • Stata绘图:重新定义坐标轴刻度标签
    • Stata绘图:用-bytwoway-实现快速分组绘图
    • Stata绘图:一个干净整洁的-Stata-图形模板qlean
    • Stata绘图:在图片中添加虚线网格线
    • Stata绘图:怎么在Stata图形中附加水平线或竖直线?
    • Stata绘图:制作教学演示动态图-GIF
    • Stata绘图:绘制一颗红心-姑娘的生日礼物
    • Stata绘图:bgshade命令-在图形中加入经济周期阴影
    • Stata绘图:让图片透明——你不要掩盖我的光芒
    • Stata:图形美颜-自定义绘图模板-grstyle-palettes
    • Stata绘图:多维柱状图绘制
    • Stata绘图:用暂元统一改变图形中的字号
    • 一文看尽 Stata 绘图
    • Stata绘图:绘制单个变量的时序图

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


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

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