大数跨境
0
0

Stata绘图秘籍:代码打造极简时钟

Stata绘图秘籍:代码打造极简时钟 Stata and Python数据分析
2025-03-31
0
导读:A still tongue makes a wise head.

本文作者:蒋成阳,河南大学高级金融学院

本文编辑:刘   畅

技术总编:马梦杰

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-11    local num_cmd `num_cmd' (scatteri `y_num' `x_num' "`label'"ms(none) mlabcol(black) mlabpos(0mlabsize(*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' == 120, `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 { // 循环生成112小时的刻度    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 / 180        local 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命令,绘制12:20的logo钟表图,最终生成的代码和图形如下:
// ---------------------- 绘图命令 -------------------------#delimit ;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(1legend(off)    xscale(off noline) yscale(off noline)    title("Clock Showing `hour':`minute'"size(medium))    plotregion(margin(zero))     scheme(s1mono);#delimit cr




结论




该案例展示了Stata在非传统统计绘图中的潜力:

  • 极坐标应用:突破笛卡尔坐标限制,适用于雷达图、仪表盘等场景。

  • 宏编程:通过local变量和循环简化重复代码,提升可维护性。

  • 轻量化输出:无需依赖外部工具,直接生成矢量图(PDF/TIF),适合学术论文插图。

可进一步结合scheme主题库(如white_tableau)优化视觉风格,或集成bumpline等高级图表命令扩展功能。



重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

图片

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!







往期推文推荐

DeepSeek霸榜微博?用爬虫解读微博用户的情感密码

一图读懂:中国各省金融许可证地理分布

用Stata破解百年诅咒!每年到底有多少个"黑色星期五"?

利用Deepseek结合Stata创意绘图——多元素同心圆标识设计与实现
对中国知网高被引学者数据的评估探讨
Stata中reclink命令全解析,必学干货来袭!
【爬虫实战】文献阅读小助手

爬虫实战——stata抓取教育部文件(二)

除夕烟火映征程,回顾这一年的奋斗足迹
“巳升升”送如意!

爬虫实战——Stata抓取国家公务员局工作动态信息

别让 “害虫” 毁了你的电脑!Stata 命令来救场
Stata的DOS命令批量处理文件

【爬虫实战】 人工智能机器人概念股投资策略——以“300024.SZ”机器人公司为例

stata应用:日期数据处理
【爬虫实战】Python爬取雪球评论

Python文本分析之余弦相似度

Stata应用:将数据“画”在中国地图上

Stata地图利器——geodist和geonear简单上手



【声明】内容源于网络
0
0
Stata and Python数据分析
爬虫俱乐部,新的启航
内容 1337
粉丝 0
Stata and Python数据分析 爬虫俱乐部,新的启航
总阅读396
粉丝0
内容1.3k