Graph 如何对齐组合图的y轴?

Graph 如何对齐组合图的y轴?,graph,stata,Graph,Stata,我正在尝试使用命令graph combine在Stata中组合多个图形。单个图形由社区贡献的命令ciplot生成 下面是一个可复制的示例: sysuse auto ciplot foreign, by(rep78) hor /// graphregion(color(white)) /// rcap(lcolor(black) msiz(zero)) /// mc(black) ms(O) /// note("") xtitle( ) /// fysiz

我正在尝试使用命令
graph combine
在Stata中组合多个图形。单个图形由社区贡献的命令
ciplot
生成

下面是一个可复制的示例:

sysuse auto 
ciplot foreign, by(rep78) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    fysize(62.5) saving(g1, replace ) nodraw

ciplot foreign, by(headroom) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    fysize(100) saving(g2, replace ) nodraw

gr combine g1.gph ///
    g2.gph ///
    , col(1) xcom graphregion(color(white)) ///
    title("Proportion of patients across studied variables")
所有工作如预期,我得到如下图表:

问题在于,由于单个记号标签的宽度不同,图形的
y轴开始位置略有不同。当这些标签之间存在较大的差异时,问题会变得更糟


有没有办法强制y轴从图形区域中的同一点开始?

改进图形的一种方法是使用
titlegap()
选项。但这可能并不令人满意,因为需要手动调整,结果不会完美。此外,如果制作了许多图形,那么将更改合并到代码中可能会很麻烦

例如:

sysuse auto, clear

ciplot foreign, by(rep78) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    yscale(titlegap(3.5)) ///
    fysize(62.5) saving(g1, replace ) nodraw

ciplot foreign, by(headroom) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    fysize(100) saving(g2, replace ) nodraw

gr combine g1.gph g2.gph, ///
    col(1) xcom graphregion(color(white)) ///
    title("Proportion of patients across studied variables")

outergap()
选项提供了类似的解决方案。这些选项记录在帮助轴缩放选项中

改进图形的一种方法是使用
标题ap()
选项。但这可能并不令人满意,因为需要手动调整,结果不会完美。此外,如果制作了许多图形,那么将更改合并到代码中可能会很麻烦

例如:

sysuse auto, clear

ciplot foreign, by(rep78) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    yscale(titlegap(3.5)) ///
    fysize(62.5) saving(g1, replace ) nodraw

ciplot foreign, by(headroom) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    fysize(100) saving(g2, replace ) nodraw

gr combine g1.gph g2.gph, ///
    col(1) xcom graphregion(color(white)) ///
    title("Proportion of patients across studied variables")

outergap()
选项提供了类似的解决方案。这些选项记录在帮助轴缩放选项中

改进图形的一种方法是使用
标题ap()
选项。但这可能并不令人满意,因为需要手动调整,结果不会完美。此外,如果制作了许多图形,那么将更改合并到代码中可能会很麻烦

例如:

sysuse auto, clear

ciplot foreign, by(rep78) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    yscale(titlegap(3.5)) ///
    fysize(62.5) saving(g1, replace ) nodraw

ciplot foreign, by(headroom) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    fysize(100) saving(g2, replace ) nodraw

gr combine g1.gph g2.gph, ///
    col(1) xcom graphregion(color(white)) ///
    title("Proportion of patients across studied variables")

outergap()
选项提供了类似的解决方案。这些选项记录在帮助轴缩放选项中

改进图形的一种方法是使用
标题ap()
选项。但这可能并不令人满意,因为需要手动调整,结果不会完美。此外,如果制作了许多图形,那么将更改合并到代码中可能会很麻烦

例如:

sysuse auto, clear

ciplot foreign, by(rep78) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    yscale(titlegap(3.5)) ///
    fysize(62.5) saving(g1, replace ) nodraw

ciplot foreign, by(headroom) hor ///
    graphregion(color(white)) ///
    rcap(lcolor(black) msiz(zero)) ///
    mc(black) ms(O) ///
    note("") xtitle( ) ///
    fysize(100) saving(g2, replace ) nodraw

gr combine g1.gph g2.gph, ///
    col(1) xcom graphregion(color(white)) ///
    title("Proportion of patients across studied variables")

outergap()
选项提供了类似的解决方案。这些选项记录在帮助轴缩放选项中。在这种情况下,刻度的标签宽度明显取决于小数位数

这里有两个主要问题:

  • ciplot
    不允许在
    y轴标签中指定可变级别的格式
  • 图形组合
    在组合两个图形之前再次绘制两个图形
下面是一个相当普遍的修正,它标准化了组合图中的小数:

graph combine g1 g2, cols(1) ///
                     xcommon ///
                     graphregion(color(white)) ///
                     title("Proportion of patients across studied variables") ///
                     nodraw ///
                     name(g3, replace)

local decimals 1
local i 0

foreach var in rep78 headroom {
    local ++i
    local j 0
    quietly levelsof `var', local(`var'm)
    foreach l of local `var'm {
        local ++j
        local il : display %2.`decimals'f `l'
        .g3.plotregion1.graph`i'.yaxis1.major.ticks[`j'][2] = "`il'"
    }  
}

graph display g3


请注意,您不能使用
ciplot
中的
ylabel()
选项指定记号标签,因为您事先不知道实际的记号值。

在这种情况下,记号的标签宽度显然取决于小数位数

这里有两个主要问题:

  • ciplot
    不允许在
    y轴标签中指定可变级别的格式
  • 图形组合
    在组合两个图形之前再次绘制两个图形
下面是一个相当普遍的修正,它标准化了组合图中的小数:

graph combine g1 g2, cols(1) ///
                     xcommon ///
                     graphregion(color(white)) ///
                     title("Proportion of patients across studied variables") ///
                     nodraw ///
                     name(g3, replace)

local decimals 1
local i 0

foreach var in rep78 headroom {
    local ++i
    local j 0
    quietly levelsof `var', local(`var'm)
    foreach l of local `var'm {
        local ++j
        local il : display %2.`decimals'f `l'
        .g3.plotregion1.graph`i'.yaxis1.major.ticks[`j'][2] = "`il'"
    }  
}

graph display g3


请注意,您不能使用
ciplot
中的
ylabel()
选项指定记号标签,因为您事先不知道实际的记号值。

在这种情况下,记号的标签宽度显然取决于小数位数

这里有两个主要问题:

  • ciplot
    不允许在
    y轴标签中指定可变级别的格式
  • 图形组合
    在组合两个图形之前再次绘制两个图形
下面是一个相当普遍的修正,它标准化了组合图中的小数:

graph combine g1 g2, cols(1) ///
                     xcommon ///
                     graphregion(color(white)) ///
                     title("Proportion of patients across studied variables") ///
                     nodraw ///
                     name(g3, replace)

local decimals 1
local i 0

foreach var in rep78 headroom {
    local ++i
    local j 0
    quietly levelsof `var', local(`var'm)
    foreach l of local `var'm {
        local ++j
        local il : display %2.`decimals'f `l'
        .g3.plotregion1.graph`i'.yaxis1.major.ticks[`j'][2] = "`il'"
    }  
}

graph display g3


请注意,您不能使用
ciplot
中的
ylabel()
选项指定记号标签,因为您事先不知道实际的记号值。

在这种情况下,记号的标签宽度显然取决于小数位数

这里有两个主要问题:

  • ciplot
    不允许在
    y轴标签中指定可变级别的格式
  • 图形组合
    在组合两个图形之前再次绘制两个图形
下面是一个相当普遍的修正,它标准化了组合图中的小数:

graph combine g1 g2, cols(1) ///
                     xcommon ///
                     graphregion(color(white)) ///
                     title("Proportion of patients across studied variables") ///
                     nodraw ///
                     name(g3, replace)

local decimals 1
local i 0

foreach var in rep78 headroom {
    local ++i
    local j 0
    quietly levelsof `var', local(`var'm)
    foreach l of local `var'm {
        local ++j
        local il : display %2.`decimals'f `l'
        .g3.plotregion1.graph`i'.yaxis1.major.ticks[`j'][2] = "`il'"
    }  
}

graph display g3


请注意,您不能使用
ciplot
中的
ylabel()
选项指定刻度标签,因为您事先不知道实际刻度值。

谢谢Roberto。这可能是一个快速解决方案,但正如您所指出的,不会令人满意地解决问题。现在进行实验:1)使用
statsby
2)使用
metan
@radek Roberto的解决方案进行绘图,如果您不想使用与我的答案相同的小数,那么使用
metan
@radek Roberto的解决方案非常令人满意。Roberto的解决方案也可以很容易地推广,因此您不必指定所需的空格数(同样基于最大小数数)。谢谢Roberto。这可能是一个快速解决方案,但正如您所指出的,不会令人满意地解决问题。现在进行实验:1)使用
statsby
2)使用
metan
@radek Roberto的解决方案进行绘图,如果您不想使用与我的答案相同的小数,那么使用
metan
@radek Roberto的解决方案非常令人满意。Roberto的解决方案也可以很容易地推广,这样您就不必指定自己是麻木的