问题描述
我正在使用Stata比较一天中8个不同时段(每个3小时,从00:00-03:00到21.00-00)在7种不同活动(例如工作,休闲)上花费的时间百分比:00)。我想制作一个“堆积的条形图”:条形图显示每个时隙上活动的相对大小(因此以百分比为单位,每个条形图总计为一百)。
下面是三个示例受访者的数据结构(现实中有363个受访者):
[variables]
respnummer domain_nr domain_type
time_00_03 time_03_06 time_06_09 time_09_12 time_12_15 time_15_18 time_18_21 time_21_00
[data]
1 1 Home 1 0 0 0 0 0 0 0
1 2 Work 0 0 0 0 1 0 0 0
1 3 Sports 0 0 0 0 0 0 1 0
1 4 Shopping 0 0 0 1 0 0 0 0
1 5 Going out 0 0 0 0 0 0 1 0
1 6 Other 0 0 0 0 0 1 0 0
2 1 Home 1 1 1 1 0 0 0 1
2 2 Education 0 0 0 1 1 1 0 0
2 3 Shopping 0 0 0 0 0 1 1 0
2 4 Going out 0 0 0 0 0 0 0 0
2 5 Other 1 1 1 1 1 1 1 1
3 1 Home 1 1 1 0 0 1 1 1
3 2 Sports 0 0 0 0 0 0 0 0
3 3 Shopping 0 0 0 1 1 0 0 0
3 4 Other 0 0 0 0 0 0 0 0
到目前为止,我仅在Stata中使用以下代码:
graph bar time_*,over(domain_type) stack
//可以,但是反之亦然,而不是百分比加起来等于100%
但这是我想要得到的结果的另一种方式:我希望X轴上有8个不同的时隙,并且每个时隙要有7种不同活动(以百分比表示)的堆叠条形。当我尝试对变量重新排序时(见下文),Stata给我以下错误:“指定的变量太多”。
graph bar domain_type,over(time_*) stack
//错误:指定了太多变量
此外,第一个“错误”图表中的百分比之和不等于百分之一百。因此,此外,需要将活动计数标准化为每个时间间隔的总计数的百分比。例如,对于第一个时隙(00:00-03:00),应将75%的活动(4个活动中的3个)归类为“首页”(第3/4大条),将25%的活动( 4中的1)被归类为“其他活动”(小条为1/4)。
如何正确创建此条形图?
解决方法
请参见并发线程Formatting catplot - stata,它引起了类似的挑战。在这里,我使用来自SSC的Main.class
,这里只是catplot
的包装器,但我对百分比计算的语法更加熟悉。
您的变量graph bar
看起来像是带有值标签的数字变量,但您不提供标签映射。
domain_type
与
一样,也可以使用 Stata Journal 中的clear
input respnummer domain_nr str9 Domain_Type time_00_03 time_03_06 time_06_09 time_09_12 time_12_15 time_15_18 time_18_21 time_21_00
1 1 Home 1 0 0 0 0 0 0 0
1 2 Work 0 0 0 0 1 0 0 0
1 3 Sports 0 0 0 0 0 0 1 0
1 4 Shopping 0 0 0 1 0 0 0 0
1 5 "Going out" 0 0 0 0 0 0 1 0
1 6 Other 0 0 0 0 0 1 0 0
2 1 Home 1 1 1 1 0 0 0 1
2 2 Education 0 0 0 1 1 1 0 0
2 3 Shopping 0 0 0 0 0 1 1 0
2 4 "Going out" 0 0 0 0 0 0 0 0
2 5 Other 1 1 1 1 1 1 1 1
3 1 Home 1 1 1 0 0 1 1 1
3 2 Sports 0 0 0 0 0 0 0 0
3 3 Shopping 0 0 0 1 1 0 0 0
3 4 Other 0 0 0 0 0 0 0 0
end
reshape long time_,i(respnummer domain_nr) j(when) string
replace when = subinstr(when,"_","-",.)
* install first with code: ssc install catplot
catplot Domain_Type when [fw=time_],percent(when) asyvars stack recast(bar)
查看结果
tabplot