Stata 绘图中的配色方案选择

Stata 绘图中的配色方案选择

本教程介绍了 RGB 和 HEX 两种颜色模式的转换和应用以及 colorscheme 命令的使用。

视频讲解

colorscheme:ColorBrewer 配色方案

colorscheme 命令应用了 ColorBrewer 配色方案,这是个非常有名的地图配色方案。该命令返回一组对应于指定主题的 RGB 颜色,可以快速进行绘图的配色。

ColorBrewer 配色方案

  • 安装 colorscheme 命令:
1
net install colorscheme.pkg, from("https://github.com/matthieugomez/stata-colorscheme/raw/master/")

这个配色方案中包含了下面三种调色板:

  1. Sequential Palettes:顺序调色板
  • 顺序调色板适用于从低到高的有序数据。亮度控制这些主题的外观,浅色用于较低的数据值,深色用于高数据值。所有的顺序调色板都可以从 3 个不同的值变化到 9 个不同的值。
  • Blues BuGn BuPu GnBu Greens Greys Oranges OrRd PuBu PuBuGn PuRd Purples RdPu Reds YlGn YlGnBu YlOrBr YlOrRd
  1. Diverging Palettes:发散调色板
  • 不同的调色板在数据范围的两端同时强调中等临界值和极端值。低和高的极端值用深浅不一的色彩来强调。所有不同的调色板都可以从 3 个不同的值变化到 11 个不同的值。
  • BrBG PiYG PRGn PuOr RdBu RdGy RdYlBu RdYlGn Spectral
  1. Qualitative Palettes:定性调色板
  • 定性调色板并不意味着图例类之间的幅度差异,色调被用来创建类之间的主要视觉差异。定性方案最适合于表示名义或分类数据。
  • Accent (8) Dark2 (8) Paired (12) Pastel1 (9) Pastel2 (8) Set1 (9) Set2 (8) Set3 (12)

我们通过上次讲的中国宏观杠杆率数据来演示如何使用吧:

1
2
3
4
5
6
7
8
9
10
11
clear all
/* 获取中国宏观杠杆率数据 */
cmlrd

/* 安装和设定绘图主题: */
ssc install blindschemes, replace all
/* 我最喜欢的绘图主题是 plotplain */
set scheme plotplain, permanently

/* 绘制一幅线图 */
line 居民部门 非金融企业部门 政府部门 中央政府 地方政府 实体经济部门 金融部门资产方 金融部门负债方 月份

1
2
3
/* 我们绘制了 8 条线,也就是我们需要设定八个颜色 */
/* 使用 Paired 调色板 */
colorscheme 8, palette(Paired) display

1
2
3
4
5
6
7
8
9
10
11
12
13
/* 查看返回值 */
return list

*> macros:
*> r(color1) : "166 206 227"
*> r(color2) : "031 120 180"
*> r(color3) : "178 223 138"
*> r(color4) : "051 160 044"
*> r(color5) : "251 154 153"
*> r(color6) : "227 026 028"
*> r(color7) : "253 191 111"
*> r(color8) : "255 127 000"
*> r(colors) : ""166 206 227" "031 120 180" "178 223 13.."
1
2
3
4
/* 然后我们就可以利用返回值里面的结果了 */
line 居民部门 非金融企业部门 政府部门 中央政府 ///
地方政府 实体经济部门 金融部门资产方 ///
金融部门负债方 月份, lc(`r(colors)')

这就是调色板的使用了,colorscheme 使用的是 ColorBrewer 配色方案,关于这个配色方案可以浏览:https://czxa.top/colors 进行调色板选择。

RGB 与 HEX 颜色

RGB 和 HEX 是最常用的两种颜色模式了。RGB 三个字母分别表示红色、绿色和蓝色,也就是色彩的三原色,自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成。计算机定义颜色时 R、G、 B 三种成分的取值范围是 0-255,0 表示没有刺激量,255 表示刺激量达最大值。R、G、B均为255时就合成了白光,R、G、B均为0时就形成了黑色,当两色分别叠加时将得到不同的 “C(Cyan,青色)、M(Magenta,品红)、Y(Yellow,黄色)” 颜色。

HEX 颜色模式实际上是 RGB 颜色模式的十六进制表示模式,例如 RGB(0, 0, 0) 等价于 #000000,HEX 颜色模式有六位,前两位是 R 的十六进制,中间两位是 G 的十六进制表示,最后两位是 B 的十六进制表示。再例如 RGB(255, 255, 255) 等价于 #FFFFFF

为了演示 RGB 和 HEX 是如何转换的,我编写了两个 Stata 命令,首先是 rgb2hex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
cap prog drop rgb2hex
prog def rgb2hex, rclass
version 14.0
syntax anything [, Play]
tokenize `anything'
forval m = 1/3{
if ``m'' > 255 | ``m'' < 0 di as error "RGB参数应在0~255之间!"
}
forval m = 1/3{
local mod`m' = mod(``m'', 16)
local div`m' = (``m'' - `mod`m'') / 16
}
foreach n in "mod1" "mod2" "mod3" "div1" "div2" "div3"{
if ``n'' > 9{
cap if ``n'' == 10 local `n' = "A"
cap if ``n'' == 11 local `n' = "B"
cap if ``n'' == 12 local `n' = "C"
cap if ``n'' == 13 local `n' = "D"
cap if ``n'' == 14 local `n' = "E"
cap if ``n'' == 15 local `n' = "F"
}
}
di in green "#`div1'`mod1'`div2'`mod2'`div3'`mod3'"
ret local hex "#`div1'`mod1'`div2'`mod2'`div3'`mod3'"
forval m = 1/3{
local k`m' = 255 - ``m''
}
if "`play'" != "" tw scatteri 0 0 , ysc(off) xsc(off) ms(i) plotr(fc(rgb(`anything'))) text(0 0 "RGB(`anything')" "#`div1'`mod1'`div2'`mod2'`div3'`mod3'", size(*4) color(rgb(`k1' `k2' `k3')))
end

这个命令有一个选项 p,指定 p 的时候会绘制一幅图:

1
2
3
4
rgb2hex 23 34 45
*> #17222D

rgb2hex 23 34 45, p

这个图的背景就是 RGB(23, 34, 45),大概是墨青色。图片上文本的颜色正好是背景的相反色 RGB(232, 221, 210),这是程序里面的这个段起的作用:

1
2
3
forval m = 1/3{
local k`m' = 255 - ``m''
}

假如我们想在程序中使用这个颜色,可以像下面这样使用:

1
2
3
4
5
6
tw scatter price weight, ///
ms(O) ///
msize(*4) ///
mc("23 34 45") ///
mlc("23 34 45") ///
sort

Stata 预置了一些颜色可以使用:

例如使用 dkorange:

1
2
3
4
5
6
tw scatter price weight, ///
ms(O) ///
msize(*4) ///
mc(dkorange) ///
mlc(dkorange) ///
sort

上面这幅颜色地图是使用 vgcolormap 命令绘制的,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
*! Version 1.01 7/26/04, added msymbol
program vgcolormap
syntax [, Quietly ]
preserve
set more off
qui drop _all
local lista black gs0 gs1 gs2 gs3 gs4 gs5 gs6 gs7 gs8 gs9 gs10 gs11 gs12 gs13 gs14 gs15 gs16 white blue bluishgray brown cranberry cyan dimgray dkgreen dknavy dkorange eggshell emerald forest_green gold gray green khaki lavender lime ltblue ltbluishgray ltkhaki magenta maroon midblue midgreen mint navy olive olive_teal orange orange_red pink purple red sand sandb sienna stone teal yellow ebg ebblue edkblue eltblue eltgreen emidblue erose
local xmax = 6
local targname mcolor
local title "Color Map of Standard Stata Colors"
local cmd
qui set obs 0
qui gen x = .
qui gen y = .
qui gen str10 s = ""
local x = 0
local y = 1
foreach ela of local lista {
local `targname' `ela'
local x = `x'+1
if `x' > `xmax' {
local y = `y' + 1
local x = 1
}
local obs = `=_N'+1
qui set obs `obs'
qui replace y = `y' in l
qui replace x = `x' in l
qui replace s = "`ela'" in l
local c "sc y x in `=_N', pstyle(p1) mcolor(`mcolor') mlabel(s) mlabpos(3) msize(huge) msymbol(S)" // 7/26/04, added msymbol(S)
local cmd "`cmd' (`c')"
}
* di "`cmd'"
local topx = `xmax' + .6
local topy = `y' + 1
`quietly' di as text "Rendering colors, please wait"
capture twoway `cmd', ysca(r(0 `topy')) xsca(r(.8 `topx')) ///
xlab(none) ylab(none) ysca(reverse) ///
xtitle("") ytitle("") title("`title'") ///
legend(nodraw)
end

另外你也可以运行 full_palette 查看 Stata 预置的调色板:

1
2
3
4
5
* 安装
ssc install full_palette

clear all
full_palette

虽然我很常使用 RGB 颜色,但是并不代表 Stata 不能使用其它的颜色模式,具体可以运行这个命令查看帮助文档:help colorstyle

我编写的另一个命令是 hex2rgb,用于将 HEX 颜色模式转换成 RGB 颜色模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
* 把16进制的颜色代码转为RGB颜色代码
* rgb2hex 244 199 195, p
* hex2rgb #F4C7C3, p
cap prog drop hex2rgb
prog def hex2rgb, rclass
version 14.0
syntax anything [, Play]
local r1 = substr("`anything'", 2, 1)
local r2 = substr("`anything'", 3, 1)
local g1 = substr("`anything'", 4, 1)
local g2 = substr("`anything'", 5, 1)
local b1 = substr("`anything'", 6, 1)
local b2 = substr("`anything'", 7, 1)
foreach n in "r1" "r2" "g1" "g2" "b1" "b2"{
if "``n''" == "A" local `n' = 10
else if "``n''" == "B" local `n' = 11
else if "``n''" == "C" local `n' = 12
else if "``n''" == "D" local `n' = 13
else if "``n''" == "E" local `n' = 14
else if "``n''" == "F" local `n' = 15
else if "``n''" == "a" local `n' = 10
else if "``n''" == "b" local `n' = 11
else if "``n''" == "c" local `n' = 12
else if "``n''" == "d" local `n' = 13
else if "``n''" == "e" local `n' = 14
else if "``n''" == "f" local `n' = 15
}
local r = `r1' * 16 + `r2'
local g = `g1' * 16 + `g2'
local b = `b1' * 16 + `b2'
local rm = 255 - `r'
local gm = 255 - `g'
local bm = 255 - `b'
di in green "`r' `g' `b'"
ret local rgb = "`r' `g' `b'"
if "`play'" != "" tw scatteri 0 0 , ysc(off) xsc(off) ms(i) plotr(fc(`r' `g' `b')) text(0 0 "RGB(`r' `g' `b')" "`anything'", size(*4) color(rgb(`rm' `gm' `bm')))
end

例如:

1
2
3
hex2rgb #F4C7C3, p

*> 244 199 195

在 R 语言的绘图中我经常使用 HEX 颜色,例如:

1
2
3
library(ggplot2)
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
geom_point(size = 2, color = "#F4C7C3")

stcolor:在Stata绘图中使用中国、日本传统色以及谷歌配色

这个命令包是我之前写的。原理类似于上面提到的 vgcolormap 命令,安装方法如下:

1
2
3
4
* 首先你需要安装github命令,这个命令是用来安装github上的命令的:
net install github, from("https://haghish.github.io/github/")
* 然后就可以安装这个命令了:
github install czxa/stcolor, replace force

这个命令包里面包含了 552 个Stata颜色文件和 5 个 Stata 命令:

  cncm jpncm gcm rgb2hex hex2rgb
作用 绘制中国传统色地图 绘制日本传统色地图 绘制谷歌配色地图 RGB颜色转16进制 16进制颜色转RGB
基本语法 cncm jpncm gcm rgb2hex 77 25 25, p hex2rgb #fce8b2, p
  cncm, c(1) jpncm, c(red) gcm, c(1)    
  cncm, c(2) jpncm, c(brown) gcm, c(2)    
  cncm, c(3) jpncm, c(green) gcm, c(3)    
    jpncm, c(yellow) gcm, c(4)    
      gcm, c(5)    

前个命令的运行结果:

中国传统色 日本传统色

谷歌颜色地图:

rgb2hex 和 hex2rgb运行结果:

rgb2hex 77 25 25, p hex2rgb #a1a8f2, p

安装好之后的颜色使用示例:
另外的552个颜色文件的作用就是是的上面图片上的颜色可以被直接使用,但是需要注意的是 谷歌系列的颜色需要在颜色名称前加个谷歌才能使用。
例如:

1
2
3
4
5
6
cd "~/Desktop"
cncm
sysuse auto, clear
tw sc price headroom, msize(med) mc(章丹) || ///
lfit price headroom, lw(*1.5) lc(十样锦) ///
by(for, note("") leg(pos(6) row(1))) sch(plotplain)

1
2
sysuse auto, clear
tw sc price weight, mc(谷歌pteala700)

更多疑问欢迎在 TidyFriday 的知识星球提问!

知识星球附件链接:https://t.zsxq.com/mY7Yf6y

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×