按双向散布中的变量排序。 X 轴保持字母顺序并且排序会产生乱码:为什么?

Sort by variable in twoway scatter. X-axis stays alphabetical and sort produces gibberish: why?

我有两个变量:

ie_ctotal
cntry2

注意:cntry2 是字符串变量的 encoded 版本 cntry:我不知道这是否会影响事情。

我想要 ie_ctotalcntry2twoway scatter,并且我想通过另一个变量 gdppc

对这个散点进行排序
 twoway  || scatter ie_ctotal cntry2, c(1) xlabel(,valuelabel)

上面没有 sort 的工作正常。然而,一旦我介绍 sort

 twoway  || scatter ie_ctotal cntry2, c(1) sort(gdppc) xlabel(,valuelabel)

图表变得乱码,或者更确切地说,它根据 sort 连接,但 x 轴仍然按字母顺序排列,使连接看起来很潦草。

关于我做错了什么有什么想法吗?

注意:我不想 sort 原始数据,因为我在之前的问题中被告知这是一个坏主意。所以我只想 sort 这一张图的数据。

这里没有可重现的例子,连图表都没有,但是可以猜到问题所在。

您在上方输入

c(1) 

这是不明智的,尽管 Stata 做了正确的事情。最好输入

c(l)

指示 Stata 将图形上的数据点连接成一条线。 (在这个细节上向@Dimitriy V. Masterov 致敬。)

在您的第一个示例中,cntry2 的值定义了 x 轴。

如您所说,sort(gdppc) 的作用是按值从低 gdppc 到最高的顺序连接点。结果显然不是你想要的。

这是一个愚蠢的可重现的例子,说明了这一点。

. sysuse auto, clear
(1978 Automobile Data)

. scatter mpg weight, sort(price) c(l)

您想将国家/地区排序为 gdppc 顺序。这就像在 Stata 的自动数据中根据 mpg 排序 make,然后绘制 weight。在这里,我只针对外国汽车这样做。这不是一个很好的图表,但它听起来很接近你想要的。此解决方案需要安装 labmask,为此 search labmask,然后从 Stata Journal 网站下载。

sysuse auto, clear
keep if foreign
sort mpg 
gen obsno = _n 
labmask obsno, values(make) 
scatter weight obsno, xla(1/22, valuelabel ang(v) noticks) xtitle("") 

简而言之:这里的sort()选项定义了一个连接顺序;它不会将 x 轴变量映射到重组后的版本。在图形之前你需要做的。

更新事实上,你可以在没有任何事先操作的情况下得到基本相同的图表:

graph dot (asis) weight if foreign, over(make, sort(mpg) label(ang(v)))  vertical linetype(line) lines(lc(none))

这与 OP 对将标记类别放在 x 轴上的兴趣一致。更易于阅读的图表会将它们放在 y 轴上:然后可以从左到右阅读文本。为此,请省略上面的 vertical:这是 graph dot 的默认值。虽然上面的命令通过将颜色设置为 none 来省略引导线,但非常细的浅色引导线会有所帮助。

这使用了使用另一个变量的顺序进行编码的技巧来获得正确的排序:

sysuse auto, clear
keep if foreign==1

sencode make, gen(encoded_make) gsort(-weight)
levelsof encoded_make, local(labels)
tw scatter price encoded_make, mlabel(weight) c(1) xlabel(`labels', value angle(45)) sort(weight)

您需要从 SSC 安装 sencode