Stata 和 R 语言绘图中如何快速的使用调色板?

今天给大家推荐一个我每次绘图都在使用的调色应用!

https://tidyfriday.cn/colors/

建议加入到电脑的收藏夹里面!

这个应用是根据 ColorBrewer 网站修改之后部署到我的服务器上的,特别适合 R 语言和 Stata 用户使用,另外还增加了不少颜色选择,使用起来非常方便。

颜色数量的选择

在左上角有个 Number of data classes,可以下拉选择所需要的颜色数量,不同的调色板最大可选择的颜色数量可能是不同的:

只有少数调色板可以选择 16、34、51 种颜色,例如 scico1 和 scico2 系列的。

调色板类别的选择

比起 ColorBrewer,我增加了很多调色板:

其中只有第一行的 sequential、diverging 和 qualitative 三个是 ColorBrewer 的调色板,其他的都是我增加的,其中 ggsci 和 scico 两个是我最常用的,是两个 R 包的名字,例如 scico 包的调色板有这些:

scico::scico_palette_show()

使用这个网页应用可以快速预览这些调色板的配色效果。例如之前的夜间灯光地图使用的就是 lajolla 调色板:

平台上这个色系的预览效果:

使用选定的色系

这个应用特别针对 Stata 和 R 语言的用户进行了设计。例如对于 Stata 用户,经常需要一系列的 RGB 颜色,可以这样设置:

点击 RStata 就可以展开这个窗口了。

Stata 通常使用 RGB 颜色,所以这里需要选择 RGB,然后点击 RStata 拉出结果窗口就可以复制这些颜色值了。

例如在数据分享 中债国债到期收益率期限结构 (截止 2021 年 9 月 20 日) 数据中有这么一幅图:

这幅图需要很多颜色来表示不同的线条,就可以使用这个网页应用进行颜色选择,例如我们选择 tidyquant 里面的 10-class Light 调色板:

这 10 种颜色的值分别是:”44 62 80” “227 26 28” “24 188 156” “204 190 147” “166 206 227” “31 120 180” “178 223 138” “251 154 153” “253 191 111” “255 127 0”,在 Stata 中可以这样使用:

use "中债国债到期收益率数据(截止2021年9月20日).dta", clear 
line rate1m rate3m rate6m rate1y rate2y ///
rate3y rate5y rate7y rate10y rate20y date, ///
xlabel(#6, ang(20)) xti("日期") yti("国债收益率") ///
leg(order(1 "1 月期" ///
2 "3 月期" ///
3 "6 月期" ///
4 "1 年期" ///
5 "2 年期" ///
6 "3 年期" ///
7 "5 年期" ///
8 "7 年期" ///
9 "10 年期" ///
10 "20 年期") pos(1) ring(0) col(3)) ///
lc("44 62 80" "227 26 28" "24 188 156" "204 190 147" "166 206 227" "31 120 180" "178 223 138" "251 154 153" "253 191 111" "255 127 0") lp(solid ...) ///
ti("中债国债到期收益率期限结构") ///
subti("爬取 & 整理:微信公众号 RStata") ///
caption("数据来源:中国债券信息网<https://yield.chinabond.com.cn/cbweb-mn>")

gr export "中债国债到期收益率期限结构.png", replace width(1200)

也就是直接把 10 中颜色的 RGB 值拷贝到 lc() 选项里面就可以了。

如果你是 R 语言用户,建议使用 HEX 颜色值,这个之后把 RGB 改成 HEX 即可:

R 语言的绘图代码如下:

library(tidyverse)
# 字体设置
library(showtext)
showtext_auto(enable = TRUE)
font_add("songti", regular = "song.otf")
cnfont <- "songti"
library(hrbrthemes)
theme_set(
theme_ipsum(base_family = cnfont) +
theme(axis.text.x = element_text(angle = 20, vjust = 0.4),
axis.text.y = element_text(hjust = 0.4),
axis.line.x = element_line(),
axis.line.y = element_line(),
panel.grid.minor = element_blank(),
axis.ticks.length = unit(1.5, "mm"),
axis.ticks.x = element_line(size = 0.2),
axis.ticks.y = element_line(size = 0.2),
panel.grid.major = element_line(linetype = 3, size = 0.5),
plot.background = element_rect(color = "white"))
)

haven::read_dta("中债国债到期收益率数据(截止2021年9月20日).dta") -> df

df %>%
select(date, rate1m, rate3m, rate6m,
rate1y, rate2y, rate3y,
rate5y, rate7y, rate10y,
rate20y) %>%
gather(-date, key = "key", value = "value") %>%
mutate(key = factor(key,
levels = c("rate1m", "rate3m", "rate6m",
"rate1y", "rate2y", "rate3y",
"rate5y", "rate7y", "rate10y",
"rate20y"),
labels = c("1 月期", "3 月期", "6 月期",
"1 年期", "2 年期", "3 年期",
"5 年期", "7 年期", "10 年期",
"20 年期"))) %>%
ggplot(aes(x = date, y = value, color = key)) +
geom_line() +
scale_color_manual(values = c("#2c3e50", "#e31a1c", "#18bc9c", "#ccbe93", "#a6cee3", "#1f78b4", "#b2df8a", "#fb9a99", "#fdbf6f", "#ff7f00")) +
theme(legend.position = c(0.8, 0.8)) +
guides(color = guide_legend(nrow = 4, byrow = T)) +
scale_x_date(labels = scales::date_format(),
breaks = scales::date_breaks(width = "2 years")) +
scale_y_continuous(breaks = seq(0, 10, by = 2), limits = c(0, 10)) +
labs(title = "中债国债到期收益率期限结构",
subtitle = "爬取 & 整理:微信公众号 RStata",
caption = "数据来源:中国债券信息网<https://yield.chinabond.com.cn/cbweb-mn>",
color = "", x = "日期", y = "国债收益率")

ggsave("中债国债到期收益率期限结构2.png", width = 10, height = 6, device = png)

也就是直接把 HEX 颜色值直接复制粘贴到 scale_color_manual() 里面即可!是不是也很方便。

在绘制地图中使用

例如在 Stata 绘制地图中使用,下面的案例展示了如何使用 Stata 绘图展示 2019 年中国各省市地区生产总值:

这里使用的是 ggsci2 中的 10-class teal_material:

完整的 Stata 绘图代码如下:

import delimited using "2020年中国各省市地区生产总值.csv", clear encoding(utf8)
gen prov = substr(省份, 1, 6)
save 2020年中国各省市地区生产总值, replace

use chinaprov2019mini_db.dta, clear
gen prov = substr(省, 1, 6)
merge 1:1 prov using 2020年中国各省市地区生产总值
replace 地区生产总值 = -1 if missing(地区生产总值)
grmap 地区生产总值 using chinaprov2019mini_coord.dta, ///
id(ID) osize(vvthin ...) ocolor(white ...) ///
clmethod(custom) clbreaks(-1 0 20000 40000 60000 80000 120000) ///
fcolor(gray "224 242 241" "178 223 219" "128 203 196" "77 182 172" "38 166 154") ///
leg(order(2 "无数据" 3 "< 2 万亿元" 4 "2~4 万亿元" 5 "4~6 万亿元" 6 "6~8 万亿元" 7 "> 8 万亿元")) ///
graphr(margin(medium)) ///
line(data(chinaprov2019mini_line_coord3.dta) ///
/// 去除秦岭淮河线(4)、胡焕庸线(7)
select(keep if inlist(group, 1, 2, 3, 5, 6)) ///
by(group) size(vvthin *1 *0.5 *0.5 *0.5) ///
pattern(solid ...) ///
color(white /// 省界颜色
black /// 国界线颜色
"0 85 170" /// 海岸线颜色
black /// 小地图框格颜色
black /// 比例尺和指北针颜色
)) ///
polygon(data(polygon3) fcolor(black) ///
osize(vvthin)) ///
label(data(chinaprov2019mini_label3) x(X) y(Y) label(cname) length(20) size(*0.8)) ///
ti("2019 年中国各省市地区生产总值") ///
subti("绘制:微信公众号 RStata") ///
caption("数据来源:各地统计局", size(*0.8))
gr export pic3.png, replace width(1200)

上面代码中的 fcolor() 就是使用这个网页应用生成的。

R 语言绘制地图的案例上面就有了:

这个图的绘制方法可以学习课程:「使用 R 语言绘制中国夜间灯光地图

下载附件