SAS:使用 PROC SGPLOT 绘制不包括周末的日期
SAS: plotting dates excluding weekends using PROC SGPLOT
我是 运行 SAS 9.3,我正在尝试使用 PROC SGPLOT 创建一个图,该图 (1) 仅将我的数据集中包含的日期显示为连续日期(即不包括周末和节假日) , 而 (2) 在 XAXIS 上显示可用信息(例如,一个月的第一天)。我可以分别做这两个,但我想不出把这两个结合起来的方法。具体来说,当我使用 DISCRETE 选项时,VALUE 和 TICKVALUEFORMAT 选项似乎被禁用(我在文档中没有看到任何对此的讨论)。
所以我有两个问题:
(1) 有没有办法解决 DISCRETE 选项和 VALUES/TICKVALUES 之间的这种相互作用?
(2) 有没有更好的方法来做我想做的事情?
(完美的做法是绘制 X 和 Y 变量,并使用第三个变量作为 x 轴的标签,但我找不到这样做的方法。)
这里有一些示例代码可以说明这一点;如果排除 weekends/holidays,则代码应绘制一条直线(我附上了下面生成的图):
*Create Dataset of Weekdays, dropping some holidays;
data weekdays (where=(weekday~=1 and weekday~=7 and date~="01JAN1960"d));
format date date9.;
do i=0 to 100;
date=i;
weekday=weekday(date);
year=year(date);
month=year*100+month(date);
output;
end;
drop i;
run;
*Create line and data label;
data weekdays;
set weekdays;
line=_n_;
format xlab .;
by month;
if first.month then xlab=put(date,monyy7.);
run;
以下将日期绘制为离散点:它正确绘制了数据点,但 VALUES 和 TICKVALUEFORMAT 命令没有影响:
*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays;
series x=date y=line;
scatter x=date y=line;
xaxis type=discrete DISCRETEORDER=DATA values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;
Here is the first plot: correct points, wrong axis
以下代码相同,但删除了 DISCRETE 选项,因此它被绘制为日期轴,显然包括周末,但 VALUE 和 TICKVALUEFORMAT 选项有效:
*Plot all dates as dates -- incorrect points, but VALUE and TICKVALUEFORMAT work;
proc sgplot data=weekdays;
series x=date y=line;
scatter x=date y=line;
xaxis values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;
Here is the second plot: wrong points, but working axis
任何建议都将受到热烈欢迎!谢谢!
这里的问题是,当您使用离散变量时,SAS 不再真正将变量视为文本以外的任何内容。如果您在两个示例中使用 TMPLOUT 选项,您可以看到这一点:在第一个示例中,值被 引用 ,因为您基本上被视为字符。
解决此问题的一种方法是使用 x2 轴和辅助变量。
在这里,在创建步骤中,我添加了一个线性计数的计数器——您正在做的事情。所以 1,2,3,4,5。
*Create Dataset of Weekdays, dropping some holidays;
data weekdays ;
format date date9.;
do i=0 to 100;
date=i;
weekday=weekday(date);
year=year(date);
month=year*100+month(date);
if (weekday~=1 and weekday~=7 and date~="01JAN1960"d) then do;
counter+1;
output;
end;
end;
run;
*Create line and data label;
data weekdays;
set weekdays;
line=_n_;
format xlab .;
by month;
if first.month then xlab=put(date,monyy7.);
run;
现在,我添加了一个 "dummy" 图,它有意不显示(白色和透明)但告诉 SAS 将什么用于 X 轴。我只是使用正常的 FORMAT 来获得正确的值标签。然后我告诉其他地块使用 X2AXIS,这意味着它们可以组成自己的轴(如果您想查看它的外观,请删除 DISPLAY=NONE)但仍然显示相同。
*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays tmplout="c:\temp\test_sgplot2.sas";
scatter x=date y=line/markeropts=(color=white) transparency=1;
format date monyy7.;
series x=counter y=line/x2axis;
scatter x=counter y=line/x2axis;
xaxis values=(3 31 60 91) type=discrete discreteorder=data TICKVALUEFORMAT=monyy7.;
x2axis display=none;
run;
我是 运行 SAS 9.3,我正在尝试使用 PROC SGPLOT 创建一个图,该图 (1) 仅将我的数据集中包含的日期显示为连续日期(即不包括周末和节假日) , 而 (2) 在 XAXIS 上显示可用信息(例如,一个月的第一天)。我可以分别做这两个,但我想不出把这两个结合起来的方法。具体来说,当我使用 DISCRETE 选项时,VALUE 和 TICKVALUEFORMAT 选项似乎被禁用(我在文档中没有看到任何对此的讨论)。
所以我有两个问题:
(1) 有没有办法解决 DISCRETE 选项和 VALUES/TICKVALUES 之间的这种相互作用?
(2) 有没有更好的方法来做我想做的事情?
(完美的做法是绘制 X 和 Y 变量,并使用第三个变量作为 x 轴的标签,但我找不到这样做的方法。)
这里有一些示例代码可以说明这一点;如果排除 weekends/holidays,则代码应绘制一条直线(我附上了下面生成的图):
*Create Dataset of Weekdays, dropping some holidays;
data weekdays (where=(weekday~=1 and weekday~=7 and date~="01JAN1960"d));
format date date9.;
do i=0 to 100;
date=i;
weekday=weekday(date);
year=year(date);
month=year*100+month(date);
output;
end;
drop i;
run;
*Create line and data label;
data weekdays;
set weekdays;
line=_n_;
format xlab .;
by month;
if first.month then xlab=put(date,monyy7.);
run;
以下将日期绘制为离散点:它正确绘制了数据点,但 VALUES 和 TICKVALUEFORMAT 命令没有影响:
*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays;
series x=date y=line;
scatter x=date y=line;
xaxis type=discrete DISCRETEORDER=DATA values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;
Here is the first plot: correct points, wrong axis
以下代码相同,但删除了 DISCRETE 选项,因此它被绘制为日期轴,显然包括周末,但 VALUE 和 TICKVALUEFORMAT 选项有效:
*Plot all dates as dates -- incorrect points, but VALUE and TICKVALUEFORMAT work;
proc sgplot data=weekdays;
series x=date y=line;
scatter x=date y=line;
xaxis values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;
Here is the second plot: wrong points, but working axis
任何建议都将受到热烈欢迎!谢谢!
这里的问题是,当您使用离散变量时,SAS 不再真正将变量视为文本以外的任何内容。如果您在两个示例中使用 TMPLOUT 选项,您可以看到这一点:在第一个示例中,值被 引用 ,因为您基本上被视为字符。
解决此问题的一种方法是使用 x2 轴和辅助变量。
在这里,在创建步骤中,我添加了一个线性计数的计数器——您正在做的事情。所以 1,2,3,4,5。
*Create Dataset of Weekdays, dropping some holidays;
data weekdays ;
format date date9.;
do i=0 to 100;
date=i;
weekday=weekday(date);
year=year(date);
month=year*100+month(date);
if (weekday~=1 and weekday~=7 and date~="01JAN1960"d) then do;
counter+1;
output;
end;
end;
run;
*Create line and data label;
data weekdays;
set weekdays;
line=_n_;
format xlab .;
by month;
if first.month then xlab=put(date,monyy7.);
run;
现在,我添加了一个 "dummy" 图,它有意不显示(白色和透明)但告诉 SAS 将什么用于 X 轴。我只是使用正常的 FORMAT 来获得正确的值标签。然后我告诉其他地块使用 X2AXIS,这意味着它们可以组成自己的轴(如果您想查看它的外观,请删除 DISPLAY=NONE)但仍然显示相同。
*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays tmplout="c:\temp\test_sgplot2.sas";
scatter x=date y=line/markeropts=(color=white) transparency=1;
format date monyy7.;
series x=counter y=line/x2axis;
scatter x=counter y=line/x2axis;
xaxis values=(3 31 60 91) type=discrete discreteorder=data TICKVALUEFORMAT=monyy7.;
x2axis display=none;
run;