如何将共享Y轴的4组Stata统计图合并为单Y轴横向组合图?
问题需求
我有4张统计图,展示同一变量content_knowledge在不同描述变量(Location、Induction、CPD、Gender)下的均值与误差棒。由于它们共享Y轴,我希望将这4张图合并为仅显示1个Y轴的组合图,同时实现类似横向排列效果,扩展绘图区域,将四个分组的分类显示在统一的X轴上。
现有生成单图及组合图的代码
foreach var in Location Induction CPD Gender { preserve drop if unique_teach_id=="" statsby mean_ck=r(mean) upper=r(ub) lower=r(lb), by(`var') clear : ci mean content_knowledge format mean_ck %9.3g twoway (bar mean_ck `var', barwidth(0.3)) /// (rcap lower upper `var') /// (scatter mean_ck `var', msymbol(none) mlabel(mean_ck) mlabposition(1)), /// legend(off) title("`var'") saving(`var'_ck, replace) /// ylabel(0(10)55) xla(minmax,valuelabel) xtitle("") ytitle("") restore } grc1leg Location_ck.gph Induction_ck.gph CPD_ck.gph Gender_ck.gph , /// title("Content Knowledge of Teachers") ycommon imargin(2 2 0 2) /// graphregion(margin(l=22 r=22)) name(sk_combine)
尝试横向排列的代码
grc1leg Location_ck.gph Induction_ck.gph CPD_ck.gph Gender_ck.gph , /// title("Content Knowledge of Teachers") row(1) iscale(1)
核心疑问
能否实现横向排列的组合图,仅保留一个共用Y轴,同时扩展绘图区域,将Location、Induction、CPD、Gender的分类显示在扩展的X轴上?
解决方案
直接用grc1leg很难实现统一X轴的效果,更合理的思路是先合并所有分组的统计结果,再一次性绘制横向排列的多组条形图,而非先画单图再拼接。具体步骤如下:
- 批量计算各分组的均值、上下置信限并合并数据集
* 初始化空数据集存储所有统计结果 clear set obs 0 gen group = "" gen category = "" gen mean_ck = . gen upper = . gen lower = . foreach var in Location Induction CPD Gender { preserve drop if unique_teach_id=="" statsby mean_ck=r(mean) upper=r(ub) lower=r(lb), by(`var') clear : ci mean content_knowledge format mean_ck %9.3g * 添加分组标识 gen group = "`var'" rename `var' category append using _temp save _temp, replace restore } * 加载合并后的数据集 use _temp, clear erase _temp.dta
- 调整X轴位置,避免不同组的条形重叠
* 为每个分组分配X轴偏移量 encode group, gen(group_num) gen x_pos = group_num * 2 + _n - group_num // 可根据分类数量调整偏移系数
- 绘制统一的横向组合图
twoway (bar mean_ck x_pos, by(group) barwidth(0.6) color(navy)) /// (rcap lower upper x_pos, lcolor(black)) /// (scatter mean_ck x_pos, msymbol(none) mlabel(mean_ck) mlabposition(1)), /// title("Content Knowledge of Teachers") /// ylabel(0(10)55, nogrid) ytitle("Content Knowledge") /// xlabel( /// 1.5 "Location" /// 3.5 "Induction" /// 5.5 "CPD" /// 7.5 "Gender" /// , noticks) /// xsc(r(0.5 8.5)) /// legend(off) /// graphregion(margin(l=20 r=20 t=10 b=20)) /// name(combined_ck, replace)
说明
- 该方法直接生成单张图,天然共用Y轴,X轴可清晰区分不同分组及其分类
- 可根据实际分类数量调整
x_pos的计算系数,避免条形重叠 - 若要保留原单图样式,可调整
barwidth、颜色、标签位置等参数
内容的提问来源于stack exchange,提问作者Shubhi
相关产品推荐
相关产品推荐

