对数图的自动标记

时间:2018-02-01 21:03:58

标签: graph stata labels logarithm stata-macros

我想为Stata 13中的一系列图表自动化图形轴值。 特别是,我想通过提供轴选项宏来显示轴标签,如10^-1010^110^2等。

以下博文中的解决方案提供了一个很好的起点:

我还可以使用" 10 {sup:`x'}"来生成更好的标签。

但是,我无法找到以下附加元素的解决方案:

  1. 轴标签的范围从10^-1010^10。此外,我的基线为ln,因此日志值为2.34.6等。特别是,下面的行仅将整数作为输入:

    label define expon `vallabel', replace
    
  2. 我想通过图表强制轴值的范围(例如,特定的轴从10^-210^5)。我知道range()只会扩展轴,但不允许修剪它们。

  3. 关于上述任何一个或两个的任何想法?

    这是R或Python中非常简单的输出,即使没有很多其他参数也是标准的,但遗憾的是Stata不是这样。

2 个答案:

答案 0 :(得分:3)

Q1。您应该在this thread中宣布从SSC查看niceloglabelsniceloglabels以及该地区的其他技巧和设备将在预计将于2018年第一季度出现在 Stata Journal 18(1)的专栏中进行讨论。

值标签仅限于与整数关联,但不限于此。您需要关注的是在任一轴上的指定点处显示为轴标签的文本;可以使用轴范围内的任何数值指定这些点。

您的具体问题似乎是您的一个变量是自然对数,但您希望用10的幂来标记轴。转换为包含对数10的对数的变量肯定很容易,但另一个程序{{1 (SSC)可以在这里提供帮助。这是一个独立的例子。

mylabels

enter image description here

我为两个轴使用了不同的样式,以显示可能的内容。在其他方面,通常最好是风格一致。

从广义上讲,* ssc inst mylabels sysuse auto, clear set scheme s1color gen lnprice = ln(price) mylabels 4000 8000 16000, myscale(ln(@)) local(yla) gen lnweight = ln(weight) mylabels 2 3 4, myscale(ln(1000*@)) suffix(" x 10{sup:3}") local(xla) scatter lnprice lnweight, yla(`yla') xla(`xla') ms(Oh) ytitle(Price (USD)) xtitle(Weight (lb)) 的使用通常比较简单,因为它可以归结为使用您想要查看的标签指定niceloglabelsxscale(log)yscale(log)还会查看变量范围或指定的最小值和最大值,以建议可能使用的标签。

Q2。 niceloglabelsrange()的一个选项,允许扩展 x 轴范围。对于大多数图形命令,相关选项为twoway functionxscale(),如果适当指定,则再次扩展轴范围。与轴标签选项所暗示的相比,这些选项都不会将数据省略为副作用或减少轴范围。如果您想省略数据,则需要使用yscale()if或克隆变量并替换您不希望在克隆中显示缺失值的值。

FWIW,对于我而言,上标看起来要比in更好。

答案 1 :(得分:0)

我终于找到了一个笨拙但可行的解决方案。 诀窍是首先生成2个局部变量:一个局部变量来评估轴值,另一个局部变量表示轴标签。然后将两者合并成一个新的本地。 我需要以某种方式分别对正值和负值进行此操作。 我相信这可以改善...

// define macros
forvalues i  = 0(1)10 {
    local a`i' = `i'*2.3
    local b`i'  `" "10{sup:`i'}" "'
    local l`i' `a`i'' `"`b`i''"' 
}

forvalues i  = 1(1)10 {
    local am`i' = `i'*-2.3
    local bm`i'  `" "10{sup:-`i'}" "'
    local lm`i' `am`i'' `"`bm`i''"' 
}

// graph
hist lnx, ///
xl(`lm4' `lm3' `lm2' `lm1' `l0' `l1' `l2' `l3' `l4')