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

时间:2017-09-29 16:41:03

标签: plot sas weekend sgplot

我正在运行SAS 9.3,我正在尝试使用PROC SGPLOT创建一个图表,(1)仅显示我的数据集中包含的日期作为连续日期(即不包括周末和假日),而(2)显示关于XAXIS的可用信息(例如,一个月的第一天)。我可以单独做这两个,但我无法弄清楚这两者的方式。具体来说,当我使用DISCRETE选项时,似乎禁用了VALUE和TICKVALUEFORMAT选项(我在文档中没有看到任何对此的讨论)。

所以我有两个问题:

(1)有没有办法解决DISCRETE选项和VALUES / TICKVALUES之间的这种交互?

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

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

以下是一些示例代码;如果不包括周末/假日,那么代码应绘制一条直线(我附上的图表已经生成):

*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 $12.;
  by month;
  if first.month then xlab=put(date,monyy7.);
run;

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

欢迎任何建议!谢谢!

1 个答案:

答案 0 :(得分:0)

这里的问题是,当你转向离散时,SAS不再真正认为变量不是文本。如果您在两个示例中使用TMPLOUT选项,则可以看到这一点:在第一个中,值是引用,因为它基本上被视为字符。

解决此问题的一种方法是使用x2axis和辅助变量。

在这里,在创建步骤中,我添加了一个线性计数的计数器 - 您正在做什么。所以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使用什么。我只是使用普通的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;