我正在尝试使用twoway
同时绘制两个轴的图形。一个轴使用变量route
来替换使用mlabel
和msymbol(none)
的常用符号。另一个轴在绘图区域中不需要特定标签,但理想情况下应在图例中键入“Incr.Dose”。
使用legend(order)
规范创建图例标签时会出现意外结果。编码的图例具有第二轴的符号作为第3个有序图例项。我希望代码将第二轴的符号作为第5项。可以通过为未使用的第5 route
添加虚拟类别并使用图形编辑器手动移动符号来解决该问题。我想知道为什么legend(order)
选项会以这种方式运行,是否与mlabel
或msymbol(none)
进行了某些交互,以及编码解决方案是否可用于重复应用。
*create data
clear
set seed 42
set obs 50
gen cuml_dose = rnormal(0,1) *10 + 100
sort cuml_dose
gen interval = [_n]
gen id = 1
gen incr_dose =0
replace incr_dose = cuml_dose[_n+1] - cuml_dose if [_n] > 1
gen route = rpoisson(1)
tab route,m
*create problem graph
sort interval
twoway scatter cuml_dose interval, mlabel(route) msymbol(none) yaxis(1) || ///
scatter incr_dose interval, yaxis(2) ///
legend(on) legend(order(0 "0=oral" 1 "1=IV" 2 "2=IM" 3 "3=patch"))
*partial solution
twoway scatter cuml_dose interval, mlabel(route) msymbol(none) yaxis(1) || ///
scatter incr_dose interval, yaxis(2) ///
legend(on) legend(order(0 "0=oral" 1 "1=IV" 2 "2=IM" 3 "3=patch" 4 "Incr. dose"))
答案 0 :(得分:2)
感谢自包含的例子。
考虑
scatter cuml_dose interval, mlabel(route) ms(none) yaxis(1) ///
|| scatter incr_dose interval, yaxis(2) ///
legend(on order(- "0 = Oral" - "1 = IV" - "2 = IM" - "3 = patch" 2 "Incr. dose"))
在上一张图表中,
cuml_dose
是第一个绘制的变量:您使用带有多个不同值的标记标签这一事实与计数无关。因此,它并不对应于0到3.我很惊讶0
中允许引用order()
。最重要的是,标记标签只是文字,而graph
并不关心文本除了按指示显示之外的内容。
incr_dose
是绘制的第二个变量:因此使用order(2
... )
。
您可以使用短划线语法任意添加图例,如上所述。
我无法看到这两个轴的使用在定义图例方面存在问题。我们只计算在任何 y 轴上绘制的内容。
底线:计算在任何 y 轴上绘制的内容,以便在语法中提及变量。