描绘组平均值的连接线图,按类别划分
Connected line plots depicting average of groups, split by category
我的数据中有很多关于两个变量的观察结果,比如 rep78
和 headroom
。
我想取第三个变量的平均值,比如每个 rep78
+headroom
单元格中的 weight
。对于每个 headroom
类别,我想分别在 x 轴上用 rep78
绘制(连接点图)这些平均值。我想更直观的思考方式是将 rep78
替换为 year
并将 headroom
替换为 state
.
我已经能够通过下面的代码得到我想要的东西:
sysuse auto2, clear
bys rep78 headroom: egen mean_w=mean(weight)
twoway (scatter mean_w rep78 if headroom==1.5, connect(l)) ///
(scatter mean_w rep78 if headroom==2.0, connect(l)) ///
(scatter mean_w rep78 if headroom==2.5, connect(l)) ///
(scatter mean_w rep78 if headroom==3.0, connect(l)) ///
(scatter mean_w rep78 if headroom==3.5, connect(l)) ///
(scatter mean_w rep78 if headroom==4.0, connect(l)) ///
(scatter mean_w rep78 if headroom==4.5, connect(l)) ///
(scatter mean_w rep78 if headroom==5.0, connect(l)), ///
legend(label(1 "1.5") label(2 "2.0") label(3 "2.5") ///
label(4 "3.0") label(5 "3.5") label(6 "4.0") ///
label(7 "4.5") label(8 "5.0"))
但是,有没有更简单(即更短)的方法来做到这一点?
我可以简化此代码的所有部分。
感谢 MCVE!
你是对的。这是获得相同图表的一个较短的解决方案,您也可以调整模数小细节:
sepscatter mean_w rep78, sep(headroom) recast(connected) name(G2, replace)
使用来自 SSC 的 sepscatter
,正如 on Statalist 宣布的那样。在 Statalist 上使用 sepscatter
作为搜索词可以找到更多示例。
我看不出有什么复杂的地方。
community-contributed 命令 sepscatter
是一个很好的包装器,但如果代码简洁是一个问题,您也可以在不安装任何东西的情况下执行以下操作:
sysuse auto2, clear
bysort rep78 headroom: egen mean_w=mean(weight)
levelsof headroom, local(head)
foreach x of local head {
local scatterlist `scatterlist' (scatter mean_w rep78 if headroom == `x', connect(l))
}
twoway `scatterlist'
为了减轻任何精度问题,如果变量未生成为双精度,则可以使用 float()
:
(scatter mean_w rep78 if headroom == float(`x'), connect(l))
我的数据中有很多关于两个变量的观察结果,比如 rep78
和 headroom
。
我想取第三个变量的平均值,比如每个 rep78
+headroom
单元格中的 weight
。对于每个 headroom
类别,我想分别在 x 轴上用 rep78
绘制(连接点图)这些平均值。我想更直观的思考方式是将 rep78
替换为 year
并将 headroom
替换为 state
.
我已经能够通过下面的代码得到我想要的东西:
sysuse auto2, clear
bys rep78 headroom: egen mean_w=mean(weight)
twoway (scatter mean_w rep78 if headroom==1.5, connect(l)) ///
(scatter mean_w rep78 if headroom==2.0, connect(l)) ///
(scatter mean_w rep78 if headroom==2.5, connect(l)) ///
(scatter mean_w rep78 if headroom==3.0, connect(l)) ///
(scatter mean_w rep78 if headroom==3.5, connect(l)) ///
(scatter mean_w rep78 if headroom==4.0, connect(l)) ///
(scatter mean_w rep78 if headroom==4.5, connect(l)) ///
(scatter mean_w rep78 if headroom==5.0, connect(l)), ///
legend(label(1 "1.5") label(2 "2.0") label(3 "2.5") ///
label(4 "3.0") label(5 "3.5") label(6 "4.0") ///
label(7 "4.5") label(8 "5.0"))
但是,有没有更简单(即更短)的方法来做到这一点?
我可以简化此代码的所有部分。
感谢 MCVE!
你是对的。这是获得相同图表的一个较短的解决方案,您也可以调整模数小细节:
sepscatter mean_w rep78, sep(headroom) recast(connected) name(G2, replace)
使用来自 SSC 的 sepscatter
,正如 on Statalist 宣布的那样。在 Statalist 上使用 sepscatter
作为搜索词可以找到更多示例。
我看不出有什么复杂的地方。
community-contributed 命令 sepscatter
是一个很好的包装器,但如果代码简洁是一个问题,您也可以在不安装任何东西的情况下执行以下操作:
sysuse auto2, clear
bysort rep78 headroom: egen mean_w=mean(weight)
levelsof headroom, local(head)
foreach x of local head {
local scatterlist `scatterlist' (scatter mean_w rep78 if headroom == `x', connect(l))
}
twoway `scatterlist'
为了减轻任何精度问题,如果变量未生成为双精度,则可以使用 float()
:
(scatter mean_w rep78 if headroom == float(`x'), connect(l))