按双向散布中的变量排序。 X 轴保持字母顺序并且排序会产生乱码:为什么?
Sort by variable in twoway scatter. X-axis stays alphabetical and sort produces gibberish: why?
我有两个变量:
ie_ctotal
cntry2
注意:cntry2
是字符串变量的 encode
d 版本 cntry
:我不知道这是否会影响事情。
我想要 ie_ctotal
和 cntry2
的 twoway 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
。
我有两个变量:
ie_ctotal
cntry2
注意:cntry2
是字符串变量的 encode
d 版本 cntry
:我不知道这是否会影响事情。
我想要 ie_ctotal
和 cntry2
的 twoway 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
。