1

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

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

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

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

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

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

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

这是 R 或 Python 中非常简单的输出,即使是标准的,没有很多额外的参数,但不幸的是在 Stata 中不是这样。

4

2 回答 2

3

Q1。您应该按照此线程niceloglabels中的声明从 SSC签出。与该领域的其他技巧和设备一起,将在预计于2018 年第一季度出现在Stata Journal 18(1) 的专栏中进行讨论。niceloglabels

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

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

* 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)) 

在此处输入图像描述

我为这两个轴使用了不同的样式,只是为了展示什么是可能的。出于其他原因,通常最好在风格上保持一致。

从广义上讲,使用niceloglabels通常更简单,因为它归结为指定xscale(log)yscale(log)使用您想要查看的标签。niceloglabels还查看变量范围或指定的最小值和最大值,以建议可能使用哪些标签。

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

^FWIW,上标对我来说比权力好得多。

于 2018-02-01T21:46:48.457 回答
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')
于 2018-06-27T07:48:48.733 回答