Stata绘制带双xline的直方图:移除标签连接线问题
问题描述
我想绘制分性别的直方图,给女性均值(female_mean)和男性均值(male_mean)各加一条xline,并给每条线单独设置标签,但目前两个标签之间存在连接线,希望移除这条线。
复现用的数据和代码
clear all input female scale 1 3 1 4 0 2 1 4 0 3 1 4 0 2 1 9 0 5 0 6 1 7 end su scale if female==1 local female_mean=round(r(mean), 0.01) local female_mean: di %9.2f round(r(mean), 0.01) su scale if female==0 local male_mean=round(r(mean), 0.01) local male_mean: di %9.2f round(r(mean), 0.01) * Create scale Histogram by gender twoway (histogram scale if female == 1, percent discrete xaxis(1 2) xla(`female_mean' "`female_mean'" `male_mean' "`male_mean'", axis(2) format(%9.3f)) xline(`female_mean' `male_mean')) /// (histogram scale if female == 0, percent discrete), legend(order(1 "Female" 2 "Male"))
原代码生成的图表(标签间有连接线):
解决办法
你之前通过额外创建第二个x轴,把均值标签设为轴刻度,Stata会默认给轴刻度添加连接线,这就是问题根源。换个思路,直接给每条xline单独添加标签,不需要额外的x轴即可解决。
修改后的代码(方式一)
clear all input female scale 1 3 1 4 0 2 1 4 0 3 1 4 0 2 1 9 0 5 0 6 1 7 end su scale if female==1 local female_mean=round(r(mean), 0.01) local female_mean_txt: di %9.2f `female_mean' // 生成显示用的文本格式均值 local female_mean_num = `female_mean' // 保留数值型均值用于定位 su scale if female==0 local male_mean=round(r(mean), 0.01) local male_mean_txt: di %9.2f `male_mean' local male_mean_num = `male_mean' * 绘制直方图+带独立标签的均值线 twoway (histogram scale if female == 1, percent discrete) /// (histogram scale if female == 0, percent discrete) /// , legend(order(1 "Female" 2 "Male")) /// xline(`female_mean_num' `male_mean_num', lcolor(red blue)) /// text(15 `female_mean_num' "`female_mean_txt'", place(e) color(red)) /// text(12 `male_mean_num' "`male_mean_txt'", place(e) color(blue))
代码说明
- 删除了
xaxis(1 2)和对应的xla设置,避免生成多余的轴刻度连接线 - 用
xline()一次性添加两条均值线,分别设置红、蓝颜色区分性别 - 用
text()命令给每条线单独添加标签,place(e)将标签放在线的右侧,调整y坐标(15、12)避免标签重叠,颜色与对应线条一致
更简洁的方式(Stata 15及以上版本支持)
直接在每条xline中使用text()选项,无需额外编写text()命令:
twoway (histogram scale if female == 1, percent discrete) /// (histogram scale if female == 0, percent discrete) /// , legend(order(1 "Female" 2 "Male")) /// xline(`female_mean_num', lcolor(red) text("`female_mean_txt'", pos(1) color(red))) /// xline(`male_mean_num', lcolor(blue) text("`male_mean_txt'", pos(1) color(blue)))
- 将两条
xline分开定义,每条单独设置标签,pos(1)表示标签位于直线右侧 - 这种写法更紧凑,同样能彻底避免标签间的连接线
内容的提问来源于stack exchange,提问作者adamsalenushka
相关产品推荐
相关产品推荐

