本文作者:蒋成阳,河南大学高级金融学院
本文编辑:刘 畅
技术总编:马梦杰
Stata and Python 数据分析
爬虫俱乐部Stata基础课程、Stata进阶课程和Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~
众所周知,stata是一款强大的统计分析软件,那么,可能很多同学不清楚,stata除了分析数据,还可以用来作图,今天本文就用Stata通过编程代码,画一个简略的时钟(以12:20这一时刻为例)
首先,生成一个单位圆上的100个等距点坐标,可以通过以下代码实现:
clearset obs 100 //设置数据集包含 100 个观测值(即 100 行数据)gen double theta = 2 * _pi * (_n - 1)/_N // 生成一个双精度浮点变量 theta,表示角度(弧度制)。 // _pi 是 Stata 内置常量,值为 π (≈3.1416),_n 是当前观测值的序号(从 1 到 100)_N 是总观测值数量(此处为 100)gen double x = cos(theta) //根据三角恒等式,x = cos(theta)gen double y = sin(theta) //根据三角恒等式,y = sin(theta) 对应单位圆纵坐标。
其次,由于圆形钟表的基本构成是12个小时刻度,一个小时为60个分针刻度,以及时针和分针的位置,接下来需要定义闹钟的时针和分针的指向。
// ===================== 自定义参数 =====================local hour = 12 // 圆形中标的小时(12小时制)local minute = 20 // 定义圆形中标的分钟local col_hour = "red" // 定义时针颜色local col_min = "blue" // 定义分针颜色// =========================================================
// ---------------------- 数字标签 -------------------------//在图表中生成12个数字标签(类似钟表刻度),按圆周均匀分布,每个标签对应1-12的数字。local num_cmd "" //创建一个空本地宏num_cmd,后续用于存储绘图命令。forvalues h = 1/12 { //遍历小时数1到12,为每个数字计算位置。local angle = (90 - 30 * `h') * _pi / 180 //Stata函数cos()和sin()使用弧度,_pi/180将角度转换为弧度。local x_num = 0.78 * cos(`angle')local y_num = 0.78 * sin(`angle') //以半径0.78(相对于图表坐标系)计算每个数字的(x, y)坐标。local label = cond(`h' == 12, "12", "`h'") //设置标签文本,当h=12时显示"12",其他情况直接显示数字1-11local num_cmd `num_cmd' (scatteri `y_num' `x_num' "`label'", ms(none) mlabcol(black) mlabpos(0) mlabsize(*1.2)) || //使用scatteri在坐标(y_num, x_num)绘制无标记点(ms(none))、黑色标签(mlabcol(black)),mlabpos(0)将标签中心对齐坐标点,mlabsize(*1.2)放大标签字体。}
// ---------------------- 指针计算 -------------------------// 分针local minute_angle = (90 - `minute' * 6) * _pi / 180 //分针每分钟转动6°(360° / 60分钟)local x_min_end = 0.75 * cos(`minute_angle')local y_min_end = 0.75 * sin(`minute_angle')//通过极坐标公式(x = r*cos(θ), y = r*sin(θ))计算指针末端位置// 时针local hour_adj = cond(`hour' == 12, 0, `hour') //将12点转换为0点,避免计算时针角度时出现12×30=360°(与0°等价)。local hour_angle = (90 - (`hour_adj' * 30 + `minute' * 0.5)) * _pi / 180//每小时30°(360° / 12小时)local x_hour_end = 0.55 * cos(`hour_angle')local y_hour_end = 0.55 * sin(`hour_angle') //时针长度为钟表半径的55%(0.55),短于分针
// ---------------------- 生成刻度 -------------------------// 生成圆形钟表的小时刻度(短线)forvalues h = 1/12 { // 循环生成1到12小时的刻度local angle = (90 - 30 * `h') * _pi / 180 // 刻度线起点x坐标(外端,靠近圆周)local x_start = 0.92 * cos(`angle') // 刻度线起点x坐标(外端,靠近圆周)local y_start = 0.92 * sin(`angle') // 刻度线起点y坐标local x_end = 0.85 * cos(`angle') // 刻度线终点x坐标(内端,靠近圆心)local y_end = 0.85 * sin(`angle') // 刻度线终点y坐标local scatter_cmd `scatter_cmd' (scatteri `y_start' `x_start' `y_end' `x_end', recast(line) lc(black) lw(0.3)) || // 拼接图形命令:绘制线段}// 同理按照上述步骤生成分钟刻度(长线)forvalues m = 0/59 { // 循环生成1到59分钟的刻度if mod(`m',5) != 0 {local angle = (90 - 6 * `m') * _pi / 180local x_start = 0.94 * cos(`angle')local y_start = 0.94 * sin(`angle')local x_end = 0.90 * cos(`angle')local y_end = 0.90 * sin(`angle')local min_ticks `min_ticks' (scatteri `y_start' `x_start' `y_end' `x_end', recast(line) lc(gs10) lw(0.15)) ||}}
// ---------------------- 绘图命令 -------------------------twoway(line y x, lc(black) lw(1.2)) // 表盘`scatter_cmd' // 小时刻度`min_ticks' // 分钟刻度`num_cmd' // 数字标签(pcarrowi 0 0 `y_min_end' `x_min_end', // 分针lc(`col_min') lw(2.5)barbsize(0.4)msize(zero))(pcarrowi 0 0 `y_hour_end' `x_hour_end', // 时针lc(`col_hour') lw(2.5)barbsize(0.4)msize(zero))(scatteri 0 0 "Stata and Python", // 中心文字ms(none) // 不显示标记mlabcolor("navy") // 文字颜色mlabpos(0) // 中心对齐mlabsize(*3.2)), // 字体大小aspect(1) legend(off)xscale(off noline) yscale(off noline)title("Clock Showing `hour':`minute'", size(medium))plotregion(margin(zero))scheme(s1mono);
该案例展示了Stata在非传统统计绘图中的潜力:
极坐标应用:突破笛卡尔坐标限制,适用于雷达图、仪表盘等场景。
宏编程:通过local变量和循环简化重复代码,提升可维护性。
轻量化输出:无需依赖外部工具,直接生成矢量图(PDF/TIF),适合学术论文插图。
可进一步结合scheme主题库(如white_tableau)优化视觉风格,或集成bumpline等高级图表命令扩展功能。
重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

