Stata 如何把变量映射到散点的颜色上:以赫罗图为例

今天我们用 Stata 画一下赫罗图。首先我们需要了解一下赫罗图:

赫罗图(Hertzsprung-Russell diagram,简写为 H-R diagram 或 HRD)是丹麦天文学家赫茨普龙及由美国天文学家罗素分别于 1911 年和 1913 年各自独立提出的。后来的研究发现,这张图是研究恒星演化的重要工具,因此把这样一张图以当时两位天文学家的名字来命名,称为赫罗图。赫罗图是恒星的光谱类型与光度之关系图,赫罗图的纵轴是光度与绝对星等,而横轴则是光谱类型及恒星的表面温度,从左向右递减。恒星的光谱型通常可大致分为 O.B.A.F.G.K.M 七种,要记住这七个类型有一个简单的英文口诀 “Oh be A Fine Girl/Guy. Kiss Me!”

上面一段是我百度的。。。

之前我用 R 语言画过赫罗图:

今天我们用 Stata 画一下,配色不是很好弄,就凑合一下。。。

import delimited using catalog.csv, clear
destring, replace force
drop if missing(ci)
keep if inrange(ci, -0.5, 2.5)

数据集里面有两个变量,含义分别是:

  • absmag: 绝对星等
  • ci:光谱类型

Stata 绘图的一个缺点是没办法将变量映射给散点的颜色,不过我们可以使用 colorscatter 来实现(尽管实现的并不是很好),该命令可以使用 ssc 安装:

ssc install colorscatter
colorscatter absmag ci ci, rgb_low("255 0 0") ///
rgb_high("0 0 255") legend(off) ///
scatter_options(msymbol(p ...)) ///
xsize(6) ysize(9) scheme(qlean) ///
xsc(off) xla(,nogrid) ysc(rev off) ///
yla(,nogrid) cmin(-0.5) cmax(2.5) ///
plotr(fcolor("0 0 0") lcolor("0 0 0")) ///
graphr(fcolor("0 0 0") lcolor("0 0 0"))

或者我们也可以通过循环语句生成绘图代码(将数据分成 255 层进行绘制,每一层一种颜色):

* 方法二:
import delimited using colors.csv, clear
save colors, replace
import delimited using catalog.csv, clear
destring, replace force
drop if missing(ci)
keep if inrange(ci, -0.5, 2.5)
egen id = cut(ci), group(255)
replace id = id + 1
merge m:1 id using colors
drop _m

* 将 color 存储到返回值中对应起来
preserve
use colors, clear
forval m = 1/255{
local a`m' = "`=color[`m']'"
}
restore

* 使用循环生成绘图语句
local cmd = "tw "
forval i = 1/255{
local cmd = `"`cmd' (sc absmag ci if id == `i', msymbol(p) mc("`a`i''"))"'
}
di `"`cmd'"'

`cmd', xsize(10) ysize(12) scheme(qlean) xsc(off) ///
xla(,nogrid) ysc(rev off) yla(,nogrid) ///
plotr(fcolor("0 0 0") lcolor("0 0 0")) ///
graphr(fcolor("0 0 0") lcolor("0 0 0")) ///
leg(off) play(text.grec) scheme(qlean)

很迷。。。但是凑合着看吧。。。

点击这里跳转到 RStata 短书平台获取附件:Stata 如何把变量映射到散点的颜色上:以赫罗图为例

评论