SAS:使用PROC SGPLOT绘制不包括周末的日期

SAS:使用PROC SGPLOT绘制不包括周末的日期,plot,sas,weekend,sgplot,Plot,Sas,Weekend,Sgplot,我正在运行SAS 9.3,我正在尝试使用PROC SGPLOT创建一个绘图,该绘图(1)仅显示数据集中包含的日期作为连续日期(即,不包括周末和节假日),而(2)显示XAXIS上的可用信息(例如,一个月的第一天)。我可以分别做这两件事,但我想不出一个办法把这两件事结合起来。具体来说,当我使用离散选项时,VALUE和TICKVALUEFORMAT选项似乎被禁用(我在文档中没有看到任何关于这方面的讨论) 所以我有两个问题: (1) 有没有办法解决离散期权和价值/价值之间的相互作用 (2) 有没有更好的

我正在运行SAS 9.3,我正在尝试使用PROC SGPLOT创建一个绘图,该绘图(1)仅显示数据集中包含的日期作为连续日期(即,不包括周末和节假日),而(2)显示XAXIS上的可用信息(例如,一个月的第一天)。我可以分别做这两件事,但我想不出一个办法把这两件事结合起来。具体来说,当我使用离散选项时,VALUE和TICKVALUEFORMAT选项似乎被禁用(我在文档中没有看到任何关于这方面的讨论)

所以我有两个问题:

(1) 有没有办法解决离散期权和价值/价值之间的相互作用

(2) 有没有更好的方法来做我想做的事

(完美的做法是绘制X和Y变量,并使用第三个变量作为X轴的标签,但我找不到这样做的方法。)

下面是一些示例代码来说明这一点;如果不包括周末/假日,则代码应绘制一条直线(我已在下面附上生成的绘图):

以下将日期绘制为离散点:它正确地绘制数据点,但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;

以下代码相同,但删除了“离散”选项,因此将其绘制为日期轴,其中显然包括周末,但值和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;


欢迎提出任何建议!谢谢大家!

这里的问题是,当您转到离散时,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 $12.;
  by month;
  if first.month then xlab=put(date,monyy7.);
run;
现在,我添加了一个“虚拟”图,它故意不显示(白色和透明),但告诉SAS XAxis使用什么。我只是在上面使用普通格式来获得正确的值标签。然后我告诉其他绘图使用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不再真正认为变量是文本以外的任何东西。如果在两个示例中使用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 $12.;
  by month;
  if first.month then xlab=put(date,monyy7.);
run;
现在,我添加了一个“虚拟”图,它故意不显示(白色和透明),但告诉SAS XAxis使用什么。我只是在上面使用普通格式来获得正确的值标签。然后我告诉其他绘图使用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;

顺便说一下,如果你还没有;我会在communities.sas.com的绘图空间中发布,看看你是否能得到更好的答案。这是你想要的,但这有点愚蠢。Sanjay或Dan、developers@SAS或其他人可能有更好的方法。非常感谢。这正是我需要的。顺便说一句,如果你还没有;我会在communities.sas.com的绘图空间中发布,看看你是否能得到更好的答案。这是你想要的,但这有点愚蠢。Sanjay或Dan、developers@SAS或其他人可能有更好的方法。非常感谢。这正是我所需要的。